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.


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'

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

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.


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


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.


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'


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



-2

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.