Caractère d'échappement dans SQL Server

93

Je souhaite utiliser une citation avec un caractère d'échappement. Comment puis-je faire?

J'ai reçu une erreur dans SQL Server

Unclosed guillemet après la chaîne de caractères.

J'écris une requête SQL dans une varcharvariable mais j'ai reçu cette erreur:

Unclosed guillemet après la chaîne de caractères.

Je souhaite utiliser des guillemets comme caractère d'échappement.

carré
la source
4
Pouvez-vous s'il vous plaît nous montrer la requête ??
marc_s

Réponses:

72

Pour 'vous échapper, vous devez simplement en mettre un autre avant:''

Comme le montre la deuxième réponse, il est possible d'échapper aux guillemets simples comme ceci:

select 'it''s escaped'

le résultat sera

it's escaped

Si vous concaténez SQL dans un VARCHAR à exécuter (c'est-à-dire SQL dynamique), je vous recommande de paramétrer le SQL. Cela a l'avantage d'aider à se prémunir contre l'injection SQL et signifie que vous n'avez pas à vous soucier d'échapper des guillemets comme celui-ci (ce que vous faites en doublant les guillemets).

par exemple au lieu de faire

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

essaye ça:

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = @Field1'
EXECUTE sp_executesql @SQL, N'@Field1 VARCHAR(10)', 'AAA'
AdaTheDev
la source
29
Pourquoi est-ce la réponse acceptée? Cela ne répond pas à la question.
Peter Moore
3
@PeterMoore Soit l'OP aurait utilisé la 1ère partie de ma réponse (doublant les guillemets, comme pour les autres réponses ci-dessous), soit aurait utilisé l'approche préférée que j'ai recommandée pour créer une requête SQL dans une variable de chaîne - à utiliser paramétrée SQL. Quoi qu'il en soit, les deux sont des réponses à la question
AdaTheDev
Cela ne répond pas à la question. Parfois, l'utilisateur a besoin d'une connexion ODBC, ce qui signifie que vous ne pouvez utiliser que du SQL pur.
Tony
Réponse
modifiée
121

Vous pouvez échapper à la citation comme ceci:

select 'it''s escaped'

le résultat sera

it's escaped
Dugokontov
la source
Cela devrait être la réponse.
Tony
43

Vous pouvez définir votre caractère d'échappement, mais vous ne pouvez l'utiliser qu'avec une LIKEclause.

Exemple:

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

Ici, il recherchera %dans toute la chaîne et c'est ainsi que l'on peut utiliser l' ESCAPEidentifiant dans SQL Server.

Aniket A
la source
21

Vous devez simplement remplacer 'par à l' ''intérieur de votre chaîne

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

Vous pouvez également utiliser REPLACE(@name, '''', '''''')si vous générez le SQL dynamiquement

Si vous souhaitez vous échapper dans une instruction similaire, vous devez utiliser la syntaxe ESCAPE

Il convient également de mentionner que vous vous exposez aux attaques par injection SQL si vous ne l'envisagez pas. Plus d'informations sur Google ou: http://it.toolbox.com/wiki/index.php/How_do_I_escape_single_quotes_in_SQL_queries%3F

Seph
la source
et pourtant les réponses de dugokontov ou de RichardPianka n'ont pas de semblable -1?
Seph
@MichaelMunsey essayez-le par vous-même: select 'renvoie l'erreur Unclosed quotation mark after the character string ''. Nulle part dans ma réponse je n'utilise "que deux ', je ne sais pas pourquoi la mienne est la seule réponse avec des votes négatifs.
Seph
12

L'échappement des guillemets dans MSSQL se fait par un guillemet double, donc a ''ou a ""produira un échappé 'et ", respectivement.

Richard Pianka
la source
0

Vous pouvez utiliser le **\**caractère avant la valeur que vous souhaitez échapper, par exemple insert into msglog(recipient) values('Mr. O\'riely') select * from msglog where recipient = 'Mr. O\'riely'

paradoxe terrien
la source
0

Si vous voulez échapper à l'entrée utilisateur dans une variable, vous pouvez faire comme ci-dessous dans SQL

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

Le @userinput sera maintenant échappé avec un guillemet simple supplémentaire pour chaque occurrence d'un devis

Nayajiv
la source
-2

Pour que le code reste facile à lire, vous pouvez utiliser des crochets []pour citer la chaîne contenant 'ou vice versa.

Ben
la source
Ceci est une erreur. Les crochets fonctionnent sur les caractères non autorisés dans les noms de champ, de table ou de schéma.
Jamie Marshall
Ouais, tu as raison, c'est pour les noms d'objets, pas pour le contenu des chaînes. Je dois mal lire la question.
Ben