Escape-Zeichen in SQL Server

92

Ich möchte ein Zitat mit Escapezeichen verwenden. Wie kann ich?

Ich habe einen Fehler in SQL Server erhalten

Nicht geschlossene Anführungszeichen nach der Zeichenfolge.

Ich schreibe eine SQL-Abfrage in eine varcharVariable, habe aber diesen Fehler erhalten:

Nicht geschlossene Anführungszeichen nach der Zeichenfolge.

Ich möchte ein Anführungszeichen als Escapezeichen verwenden.

esquare
quelle
4
Können Sie bitte zeigen uns die Abfrage ??
marc_s

Antworten:

71

Um zu entkommen, müssen 'Sie einfach vorher einen anderen setzen:''

Wie die zweite Antwort zeigt, ist es möglich, einem einfachen Anführungszeichen wie folgt zu entkommen:

select 'it''s escaped'

Ergebnis wird sein

it's escaped

Wenn Sie SQL zu einem auszuführenden VARCHAR verketten (dh dynamisches SQL), würde ich empfehlen, das SQL zu parametrisieren. Dies hat den Vorteil, dass Sie sich vor SQL-Injection schützen können. Außerdem müssen Sie sich keine Sorgen mehr machen, dass Sie solchen Anführungszeichen entkommen (was Sie tun, indem Sie die Anführungszeichen verdoppeln).

zB statt zu tun

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = ''AAA'''
EXECUTE(@SQL)

Versuche dies:

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = @Field1'
EXECUTE sp_executesql @SQL, N'@Field1 VARCHAR(10)', 'AAA'
AdaTheDev
quelle
29
Warum ist dies die akzeptierte Antwort? Es beantwortet die Frage nicht.
Peter Moore
3
@PeterMoore Entweder hätte das OP den ersten Teil meiner Antwort verwendet (Verdoppelung der Anführungszeichen gemäß den anderen Antworten unten), oder es hätte den bevorzugten Ansatz verwendet, den ich zum Erstellen einer SQL-Abfrage in einer Zeichenfolgenvariablen empfohlen habe - um parametrisiert zu verwenden SQL. In beiden
Fällen
Es beantwortet die Frage nicht. Manchmal benötigen Benutzer eine ODBC-Verbindung, was bedeutet, dass Sie nur reines SQL verwenden können.
Tony
Die bearbeitete Antwort auf mehr, es ist klarer und passt besser zur Frage
Revious
121

Sie können sich einem Zitat wie folgt entziehen:

select 'it''s escaped'

Ergebnis wird sein

it's escaped
dugokontov
quelle
Dies sollte die Antwort sein.
Tony
43

Sie können Ihr Escape-Zeichen definieren, aber nur mit einer LIKEKlausel verwenden.

Beispiel:

SELECT columns FROM table
WHERE column LIKE '%\%%' ESCAPE '\'

Hier wird %in der ganzen Zeichenfolge gesucht und so kann man den ESCAPEBezeichner in verwenden SQL Server.

Aniket A.
quelle
21

Sie müssen nur ersetzen 'mit ''in Ihrem String

SELECT colA, colB, colC
FROM tableD
WHERE colA = 'John''s Mobile'

Sie können auch verwenden, REPLACE(@name, '''', '''''')wenn Sie SQL dynamisch generieren

Wenn Sie innerhalb einer like-Anweisung maskieren möchten, müssen Sie die ESCAPE-Syntax verwenden

Erwähnenswert ist auch, dass Sie sich für SQL-Injection-Angriffe offen lassen, wenn Sie dies nicht berücksichtigen. Weitere Informationen bei Google oder: http://it.toolbox.com/wiki/index.php/How_do_I_escape_single_quotes_in_SQL_queries%3F

Seph
quelle
und doch haben Antworten von Dugokontov oder RichardPianka keine ähnlichen -1?
Seph
@MichaelMunsey probieren Sie es selbst aus: Gibt select 'den Fehler zurück Unclosed quotation mark after the character string ''. Nirgendwo in meiner Antwort verwende ich "nur zwei ', nicht sicher, warum meine die einzige Antwort mit Abstimmungen ist.
Seph
12

Austretende Zitate in MSSQL wird von einem doppelten Anführungszeichen gemacht, also ein ''oder ""produzieren ein entkam 'und "sind.

Richard Pianka
quelle
0

Sie können das **\**Zeichen vor dem Wert verwenden, dem Sie entkommen möchten, z insert into msglog(recipient) values('Mr. O\'riely') select * from msglog where recipient = 'Mr. O\'riely'

Paradox Erdling
quelle
0

Wenn Sie Benutzereingaben in einer Variablen vermeiden möchten, können Sie dies wie folgt in SQL tun

  Set @userinput = replace(@userinput,'''','''''')

Der @userinput wird jetzt mit einem zusätzlichen einfachen Anführungszeichen für jedes Auftreten eines Anführungszeichens maskiert

Nayajiv
quelle
0
WHERE username LIKE '%[_]d';            -- @Lasse solution
WHERE username LIKE '%$_d' ESCAPE '$';
WHERE username LIKE '%^_d' ESCAPE '^';

FROM: SQL Server Escape ein Unterstrich

R. Alonso
quelle
-2

Um den Code leicht lesbar zu halten, können Sie []die Zeichenfolge mit eckigen Klammern in Anführungszeichen setzen 'oder umgekehrt.

Ben
quelle
Das ist falsch. Klammern arbeiten mit unzulässigen Zeichen in Feld-, Tabellen- oder Schemanamen.
Jamie Marshall
Ja, Sie haben Recht, es ist für die Objektnamen, nicht für den Inhalt von Zeichenfolgen. Ich muss die Frage falsch lesen.
Ben