Wie entkomme ich einem einfachen Anführungszeichen in SQL Server?


956

Ich versuche zu insert einige Textdaten in eine Tabelle in SQL Server9.

Der Text enthält ein einfaches Anführungszeichen (').

Wie entkomme ich dem?

Ich habe versucht, zwei einfache Anführungszeichen zu verwenden, aber es gab mir einige Fehler.

z.B. insert into my_table values('hi, my name''s tim.');


30
"es warf mir einige Fehler" - Was waren diese Fehler?
llamaoo7

Ja, da der richtige Weg, einfache Anführungszeichen in MSSQL einzufügen, darin besteht, sie zu verdoppeln. Das Beispiel, das Sie uns zeigen, sollte funktionieren. Wie erstellen Sie diese SQL-Abfrage in welcher Sprache? Oder ist es in SQL Server Management Studio?
MaxiWheat

Antworten:


1388

Einfache Anführungszeichen werden durch Verdoppeln vermieden , so wie Sie es uns in Ihrem Beispiel gezeigt haben. Das folgende SQL veranschaulicht diese Funktionalität. Ich habe es auf SQL Server 2008 getestet:

DECLARE @my_table TABLE (
    [value] VARCHAR(200)
)

INSERT INTO @my_table VALUES ('hi, my name''s tim.')

SELECT * FROM @my_table

Ergebnisse

value
==================
hi, my name's tim.

16
Ich habe an der falschen Stelle gesucht, um mein Problem zu beheben. Es war schließlich kein Problem der Charakterflucht. Mein Problem war, dass die Datenlänge über dem Limit lag. Vielen Dank, dass Sie mir versichert haben, dass die zweimalige Verwendung des einfachen Anführungszeichens der richtige Weg ist, dem Charakter zu entkommen.
tim_wonil

Wenn ich also einen Text mit 10.000 Wörtern habe, muss ich dann meinen gesamten Text ersetzen?
Vinicius Lima

3
@ ViniciusLima: Die kurze Antwort lautet ja. Das würde sich natürlich abhängig von der Technologie ändern, mit der Sie die Daten speichern werden. Wenn Sie ein ORM verwenden, wird es dies für Sie tun. Wenn Sie Ihre SQL-Befehle manuell erstellen, möchten Sie die Funktion "Vorbereitete Anweisungen" der Sprache verwenden. Wenn Sie dies in Management Studio tun, müssen Sie das Ersetzen durchführen.
15.

1
dh zwei einfache Anführungszeichen für eines. [''] => [']
Ujjwal Singh

67

Wenn es für Sie nicht funktioniert, Ihrem einfachen Anführungszeichen mit einem anderen einfachen Anführungszeichen zu entkommen (wie bei einer meiner letzten REPLACE()Abfragen), können Sie es SET QUOTED_IDENTIFIER OFFvor Ihrer Abfrage und dann SET QUOTED_IDENTIFIER ONnach Ihrer Abfrage verwenden.

Zum Beispiel

SET QUOTED_IDENTIFIER OFF;

UPDATE TABLE SET NAME = REPLACE(NAME, "'S", "S");

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again

2
Normalerweise verwende ich den Ansatz der Verdoppelung, aber wo ich dynamisches SQL generierte, das dann auf mehreren Servern und Datenbanken ausgeführt wurde, funktionierte diese Lösung für mich, während die Verdoppelung in einem bestimmten Fall nicht funktionierte. Danke dafür!
Richard Moss

Seien Sie vorsichtig, wenn Sie auf Ansichten und Indizes für berechnete Spalten verweisen. Andernfalls wird möglicherweise eine Fehlermeldung angezeigt. stackoverflow.com/questions/9235527/…
Datum

@ RichardMoss, +1. das gleiche Szenario mit Ihnen. Der doppelte Ansatz ist die anfängliche Lösung. Bei komplexen Abfragen wie dynamischem SQL auf mehreren Servern funktioniert dies, ein doppelter Ansatz funktioniert möglicherweise nicht
Edgar Allan Bayron,

48

Wie wäre es mit:

insert into my_table values('hi, my name'+char(39)+'s tim.')

18
Verwenden Sie stattdessen char (39)
Iswanto San

17

Die Verdoppelung des Zitats hätte funktionieren sollen, daher ist es merkwürdig, dass es bei Ihnen nicht funktioniert hat. Eine Alternative ist jedoch die Verwendung von doppelten Anführungszeichen anstelle von einfachen Zeichen um die Zeichenfolge. Dh

insert into my_table values("hi, my name's tim.");


4
Was ist, wenn der Text sowohl einfache als auch doppelte Anführungszeichen enthält? Sind doppelte Anführungszeichen nicht nur für Feldnamen reserviert?
Lajos Meszaros

11

2 Möglichkeiten, dies zu umgehen:


denn 'du kannst es einfach in der Zeichenkette verdoppeln, zB select 'I''m happpy'- bekommst:I'm happy


Für jeden Charakter, dessen Sie sich nicht sicher sind: In SQL Server können Sie den Unicode eines beliebigen Zeichens erhalten, indem select unicode(':')Sie (Sie behalten die Nummer)

Also diesen Fall kannst du auch select 'I'+nchar(39)+'m happpy'


6

Eine andere Sache, auf die Sie achten sollten, ist, ob es wirklich als klassischer ASCII '(ASCII 27) oder Unicode 2019 (der ähnlich aussieht, aber nicht gleich aussieht) gespeichert ist oder nicht.

Dies ist keine große Sache bei Beilagen, aber es kann die Welt bei Auswahl und Aktualisierung bedeuten.
Wenn es sich um den Unicode-Wert handelt, wird das Escapezeichen in einer WHERE-Klausel (z. B. wobei blah = 'Workers' Comp ') so zurückgegeben, als ob der gesuchte Wert nicht vorhanden wäre, wenn das' in "Worker's Comp" tatsächlich das ist Unicode-Wert.

Wenn Ihre Clientanwendung die Eingabe mit freiem Schlüssel sowie das Kopieren und Einfügen unterstützt, kann dies in einigen Zeilen Unicode und in anderen Zeilen ASCII sein!

Eine einfache Möglichkeit, dies zu bestätigen, besteht darin, eine offene Abfrage durchzuführen, die den gesuchten Wert zurückbringt, und diesen dann zu kopieren und in Notepad ++ oder einen anderen Unicode-unterstützenden Editor einzufügen.

Das unterschiedliche Erscheinungsbild zwischen dem ASCII-Wert und dem Unicode-Wert sollte für die Augen offensichtlich sein. Wenn Sie sich jedoch zum Anal neigen, wird es in einem Hex-Editor als 27 (ASCII) oder 92 (Unicode) angezeigt.


4

Viele von uns wissen, dass die beliebte Methode, einfachen Anführungszeichen zu entkommen, darin besteht, sie wie unten beschrieben leicht zu verdoppeln.

PRINT 'It''s me, Arul.';

Verdoppelung der Methode für einfache Anführungszeichen

Wir werden nach anderen alternativen Möglichkeiten suchen, um den einfachen Anführungszeichen zu entkommen.

1. UNICODE-Zeichen

39 ist das UNICODE-Zeichen von Single Quote. So können wir es wie unten verwenden.

PRINT 'Hi,it'+CHAR(39)+'s Arul.';
PRINT 'Helo,it'+NCHAR(39)+'s Arul.';

UNICODE-Zeichen

2.QUOTED_IDENTIFIER

Eine andere einfache und beste alternative Lösung ist die Verwendung von QUOTED_IDENTIFIER. Wenn QUOTED_IDENTIFIER auf OFF gesetzt ist, können die Zeichenfolgen in doppelte Anführungszeichen gesetzt werden. In diesem Szenario müssen wir uns keinen einfachen Anführungszeichen entziehen. Dieser Weg wäre also sehr hilfreich, wenn Sie viele Zeichenfolgenwerte in einfachen Anführungszeichen verwenden. Dies ist sehr hilfreich, wenn so viele Zeilen von INSERT / UPDATE-Skripten verwendet werden, in denen Spaltenwerte in einfache Anführungszeichen gesetzt werden.

SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;

QUOTE_IDENTIFIER

FAZIT

Die oben genannten Methoden gelten sowohl für AZURE als auch für On Premises.


1

Die folgende Syntax entgeht Ihnen NUR EIN Anführungszeichen:

SELECT ''''

Das Ergebnis ist ein einfaches Anführungszeichen. Könnte sehr hilfreich sein, um dynamisches SQL zu erstellen :). Geben Sie hier die Bildbeschreibung ein


0

Das sollte funktionieren

DECLARE @singleQuote CHAR 
SET @singleQuote =  CHAR(39)

insert into my_table values('hi, my name'+ @singleQuote +'s tim.')

0

Fügen Sie einfach ein 'ein, bevor etwas eingefügt werden soll. Es wird wie ein Escape-Zeichen in sqlServer sein

Beispiel: Wenn Sie ein Feld als haben, geht es mir gut . Sie können Folgendes tun: UPDATE my_table SET row = 'Mir geht es gut.';


Ist das nicht genau das, was das OP getan hat, und das gleiche, was die Antwort mit der höchsten Abstimmung bereits sagt? Vermutlich muss es eine andere Fehlerquelle gegeben haben.
Michael MacAskill

-2

Dies sollte funktionieren: Verwenden Sie einen Schrägstrich und setzen Sie ein doppeltes Anführungszeichen

"UPDATE my_table SET row =\"hi, my name's tim.\";

Was meinst du? Sie sagen, dass PRINT \"hi, my name's tim.\";das in SSMS funktionieren wird? Es funktioniert überhaupt nicht und niemand hat jemals gesagt, dass es funktioniert.
Mohammad Musavi

Wird nie funktionieren.
Santosh Jadi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.