Comment échapper à un seul devis dans SQL Server?

957

J'essaie de insertquelques données texte dans un tableau en SQL Server9.

Le texte comprend une seule citation (').

Comment puis-je y échapper?

J'ai essayé d'utiliser deux guillemets simples, mais cela m'a jeté quelques erreurs.

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

tim_wonil
la source
30
"ça m'a jeté quelques erreurs" - Quelles étaient ces erreurs?
llamaoo7
Oui, car la bonne façon d'insérer des guillemets simples dans MSSQL est de les doubler. L'exemple que vous nous montrez devrait fonctionner. Comment faire cette requête SQL, avec quelle langue? Ou est-ce dans SQL Server Management Studio?
MaxiWheat
1
Copie possible de Remplacer les guillemets simples dans SQL Server .
Peter Mortensen

Réponses:

1389

Les guillemets simples sont échappés en les doublant , comme vous nous l'avez montré dans votre exemple. Le SQL suivant illustre cette fonctionnalité. Je l'ai testé sur SQL Server 2008:

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

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

SELECT * FROM @my_table

Résultats

value
==================
hi, my name's tim.
Cᴏʀʏ
la source
16
je cherchais au mauvais endroit pour résoudre mon problème. ce n'était pas un problème d'évasion de caractère après tout. mon problème était que la longueur des données dépassait la limite. merci de m'avoir rassuré que l'utilisation de la citation unique deux fois est la bonne façon d'échapper au personnage.
tim_wonil
Donc, si j'ai un texte contenant 10k mots, il faudra que je remplace tout mon texte?
Vinicius Lima
3
@ViniciusLima: La réponse courte est oui. Cela changerait bien sûr en fonction de la technologie que vous allez utiliser pour stocker les données. Si vous utilisez un ORM, il le fera pour vous. Si vous construisez vos commandes SQL manuellement, vous voudrez utiliser la fonctionnalité "instructions préparées" du langage. Si vous le faites dans Management Studio, vous devrez faire le remplacement.
Cᴏʀʏ
1
c'est-à-dire deux guillemets simples pour un. [''] => [']
Ujjwal Singh
67

Si échapper votre devis unique avec un autre devis unique ne fonctionne pas pour vous (comme cela n'a pas été le cas pour l'une de mes REPLACE()requêtes récentes ), vous pouvez l'utiliser SET QUOTED_IDENTIFIER OFFavant votre requête, puis SET QUOTED_IDENTIFIER ONaprès votre requête.

Par exemple

SET QUOTED_IDENTIFIER OFF;

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

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again
Brad Waite
la source
2
Normalement, j'utilise l'approche doublée, mais là où je générais du SQL dynamique qui était ensuite exécuté sur plusieurs serveurs et bases de données, cette solution a fonctionné pour moi alors que le doublement ne l'a pas fait dans un cas spécifique. Merci pour cela!
Richard Moss
Soyez prudent lorsque vous référencez des vues et des index sur des colonnes calculées ou vous pouvez obtenir une erreur. stackoverflow.com/questions/9235527/…
datagod
@RichardMoss, +1. même scénario avec vous. l'approche doublée est la solution initiale. Pour les requêtes complexes comme le SQL dynamique sur plusieurs serveurs, cela fonctionnera, l'approche doublée peut ne pas fonctionner
Edgar Allan Bayron
48

Que diriez-vous:

insert into my_table values('hi, my name' + char(39) + 's tim.')
PaulMcG
la source
18
utilisez char (39) à la place
Iswanto San
17

Le doublement de la citation aurait dû fonctionner, il est donc particulier que cela n'a pas fonctionné pour vous; cependant, une alternative consiste à utiliser des guillemets doubles, au lieu de simples, autour de la chaîne. C'est à dire,

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

Alex Martelli
la source
4
Que faire si le texte contient des guillemets simples et doubles? De plus, les guillemets doubles ne sont-ils pas réservés aux noms de champ uniquement?
Lajos Meszaros
11

2 façons de contourner cela:


car 'vous pouvez simplement le doubler dans la chaîne, par exemple select 'I''m happpy'- obtiendra:I'm happy


Pour tout caractère dont vous n'êtes pas sûr: dans le serveur sql, vous pouvez obtenir l'unicode de n'importe quel caractère par select unicode(':')(vous gardez le numéro)

Donc, ce cas, vous pouvez également select 'I'+nchar(39)+'m happpy'

Xin
la source
6

Une autre chose à laquelle il faut faire attention est de savoir s'il est vraiment stocké en tant que ASCII classique (ASCII 27) ou Unicode 2019 (qui ressemble, mais pas le même).

Ce n'est pas un gros problème sur les insertions, mais cela peut signifier le monde sur les sélections et les mises à jour.
Si c'est la valeur unicode, l'échappement de la clause 'dans une clause WHERE (par exemple, où blah =' Workers 'Comp') retournera comme si la valeur que vous recherchez n'est pas là si le 'dans "Worker's Comp" est en fait le valeur unicode.

Si votre application cliente prend en charge les clés libres, ainsi que les entrées basées sur le copier-coller, il peut s'agir d'Unicode dans certaines lignes et d'ASCII dans d'autres!

Un moyen simple de confirmer cela est de faire une sorte de requête ouverte qui ramènera la valeur que vous recherchez, puis copiez et collez cela dans notepad ++ ou dans un autre éditeur prenant en charge Unicode.

L'apparence différente entre la valeur ascii et celle unicode devrait être évidente pour les yeux, mais si vous vous penchez vers l'anale, elle apparaîtra comme 27 (ascii) ou 92 (unicode) dans un éditeur hexadécimal.

Daniel Schmidt
la source
4

Beaucoup d'entre nous savent que la méthode populaire pour échapper aux guillemets simples consiste à les doubler facilement comme ci-dessous.

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

Doubler la méthode des guillemets simples

nous allons examiner d'autres façons alternatives d'échapper aux guillemets simples.

1. Caractères UNICODE

39 est le caractère UNICODE du guillemet simple. Nous pouvons donc l'utiliser comme ci-dessous.

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

Caractères UNICODE

2.QUOTED_IDENTIFIER

Une autre solution alternative simple et meilleure consiste à utiliser QUOTED_IDENTIFIER. Lorsque QUOTED_IDENTIFIER est défini sur OFF, les chaînes peuvent être placées entre guillemets. Dans ce scénario, nous n'avons pas besoin d'échapper aux guillemets simples. Ainsi, cette méthode serait très utile lors de l'utilisation de nombreuses valeurs de chaîne avec des guillemets simples. Il sera très utile d'utiliser autant de lignes de scripts INSERT / UPDATE où les valeurs de colonne ont des guillemets simples.

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

QUOTE_IDENTIFIER

CONCLUSION

Les méthodes mentionnées ci-dessus sont applicables à la fois à AZURE et sur site.

Arulmouzhi
la source
1

La syntaxe suivante vous échappera SEULEMENT UN guillemet:

SELECT ''''

Le résultat sera un devis unique. Pourrait être très utile pour créer du SQL dynamique :). entrez la description de l'image ici

Popa Alin
la source
0

Cela devrait fonctionner

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

insert into my_table values('hi, my name'+ @singleQuote +'s tim.')
Dave Kelly
la source
0

Insérez simplement un 'avant tout élément à insérer. Ce sera comme un caractère d'échappement dans sqlServer

Exemple: Quand vous avez un champ comme, je vais bien . vous pouvez faire: UPDATE my_table SET row = 'Je vais bien.';

laxman Thapa
la source
N'est-ce pas exactement ce que le PO a fait, et la même chose que la réponse la plus votée dit déjà? Vraisemblablement, il doit y avoir une autre source d'erreur.
Michael MacAskill
-3

Cela devrait fonctionner: utilisez une barre oblique inverse et mettez un guillemet double

"UPDATE my_table SET row =\"hi, my name's tim.\";
Chris Enitan
la source
Que voulez-vous dire? Vous dites que cela PRINT \"hi, my name's tim.\";va fonctionner dans SSMS? Cela ne fonctionne pas du tout et personne n'a jamais dit que cela fonctionne.
Mohammad Musavi
Ne fonctionnera jamais.
Santosh Jadi