web-dev-qa-db-fra.com

Comment puis-je échapper à un seul devis dans SQL Server?

J'essaie de insert quelques données textuelles dans une table dans SQL Server 9.

Le texte comprend une citation simple (').

Comment puis-je y échapper?

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

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

843
tim_wonil

les guillemets simples sont évités en les doublant, comme vous l'avez montré dans votre exemple. Le code 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.
1233
Cᴏʀʏ

Si échapper votre devis unique avec un autre devis unique ne fonctionne pas (contrairement à l'une de mes récentes requêtes REPLACE()), vous pouvez utiliser SET QUOTED_IDENTIFIER OFF avant votre requête, puis SET QUOTED_IDENTIFIER ON aprè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
64
Brad Waite

Que diriez-vous:

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

Le dédoublement de la citation aurait dû fonctionner, alors il est étrange que cela ne vous ait pas aidé; Cependant, une alternative consiste à utiliser des caractères de citation doubles, au lieu de simples, autour de la chaîne. C'est à dire.,

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

17
Alex Martelli

2 façons de contourner ceci:


pour ' vous pouvez simplement le doubler dans la chaîne, par exemple. select 'I''m happpy' -- will get: I'm happy


Pour tout caractère dont vous n'êtes pas sûr: dans SQL Server, vous pouvez obtenir l'unicode de n'importe quel caractère par select unicode(':')

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

7
Xin

Une autre chose à vérifier est de savoir s'il est réellement stocké comme un classique ASCII '(ASCII 27) ou Unicode 2019 (qui semble similaire, mais pas le même).

Ce n’est pas un gros problème d’insertions, mais cela peut signifier le monde entier sur sélections et mises à jour.
S'il s'agit de la valeur unicode, le fait d'échapper à la clause 'dans une clause WHERE (par exemple, où blah =' Comp 'des travailleurs') retournera comme si la valeur que vous recherchiez n'existait pas si la fonction 'in "de Worker's Comp "est en réalité la valeur unicode.

Si votre application cliente prend en charge les entrées à clé libre, ainsi que les opérations de copier-coller, il pourrait s'agir d'Unicode dans certaines lignes et de ASCII dans d'autres!

Un moyen simple de le confirmer consiste à effectuer une requête ouverte qui ramènera la valeur recherchée, puis à la copier et la coller dans le bloc-notes ++ ou un autre éditeur prenant en charge le codage Unicode.

La différence d'aspect entre la valeur ascii et la valeur unicode devrait être évidente pour les yeux, mais si vous vous penchez vers l'anal, elle apparaîtra sous la forme 27 (ascii) ou 92 (unicode) dans un éditeur hexadécimal.

6
Daniel Schmidt

Cela devrait fonctionner: utilisez une barre oblique inversée et mettez une citation double

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

Il suffit d'insérer un 'avant quoi que ce soit à insérer. Ce sera comme un caractère d'échappement dans sqlServer

Exemple: Lorsque vous avez un champ en tant que, ça va. vous pouvez faire: UPDATE my_table SET row = 'Je vais bien.';

0
laxman Thapa

Cela devrait marcher

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

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