Jak uniknąć pojedynczego cytatu w SQL Server?

Próbuję insert wprowadzić dane tekstowe do tabeli w SQL Server 9.

Tekst zawiera pojedynczy cytat (").

Jak od tego uciec?

Próbowałem użyć dwóch pojedynczych cudzysłowów, ale rzuciło mi to kilka błędów.

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

Author: DineshDB, 2009-10-19

9 answers

Pojedyncze cytaty są unikane przez podwojenie ich, tak jak pokazałeś nam w swoim przykładzie. Poniższy SQL ilustruje tę funkcjonalność. Testowałem go na SQL Server 2008:

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

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

SELECT * FROM @my_table

Wyniki

value
==================
hi, my name's tim.
 1036
Author: Cᴏʀʏ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-21 13:52:05

Jeśli unikanie pojedynczego cytatu z innym cytatem nie działa dla ciebie (tak jak nie dla jednego z moich ostatnich zapytań REPLACE()), możesz użyć SET QUOTED_IDENTIFIER OFF przed zapytaniem, a następnie SET QUOTED_IDENTIFIER ON po zapytaniu.

Na przykład

SET QUOTED_IDENTIFIER OFF;

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

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again
 56
Author: Brad Waite,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-18 17:11:23

A może:

insert into my_table values('hi, my name'+char(39)+'s tim.')
 32
Author: PaulMcG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-27 04:27:48

Podwojenie cudzysłowu powinno zadziałać, więc to dziwne, że nie zadziałało dla ciebie; jednak alternatywą jest użycie podwójnych znaków cudzysłowu, zamiast pojedynczych, wokół ciągu. I. e.,

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

 17
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-19 01:33:44

Kolejną rzeczą, na którą należy uważać, jest to, czy naprawdę jest przechowywany jako klasyczny ASCII ' (ASCII 27) lub Unicode 2019 (który wygląda podobnie, ale nie tak samo).

to nie jest wielka sprawa na wstawkach, ale może oznaczać świat na wybór i aktualizacje.
jeśli jest to wartość unicode, to wyrażenie ' in a WHERE (np. where blah = 'Workers' s Comp') zwróci tak, jak szukana wartość nie istnieje, jeśli ' in "Worker' s Comp " jest w rzeczywistości unicode wartość.

Jeśli Twoja aplikacja kliencka obsługuje free-key, a także Kopiuj i wklej dane wejściowe, może to być Unicode w niektórych wierszach, a w innych ASCII!

Prostym sposobem na potwierdzenie tego jest wykonanie otwartego zapytania, które przywróci szukaną wartość, a następnie skopiowanie i wklejenie jej do notepad++ lub innego edytora obsługującego unicode.

różnice w wyglądzie pomiędzy wartością ascii a unicode powinny być oczywiste dla oczu, ale jeśli pochyl się w kierunku odbytu, pojawi się jako 27 (ascii) lub 92 (unicode) w edytorze szesnastkowym.

 4
Author: Daniel Schmidt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-01 21:45:34

2 sposoby obejścia tego problemu:


Dla ' można po prostu podwoić go w łańcuchu, np. select 'I''m happpy' -- will get: I'm happy


Dla dowolnego znaku, którego nie jesteś pewien: w sql server możesz uzyskać dowolny znak Unicode przez select unicode(':')

Więc w tym przypadku można również select 'I'+nchar(39)+'m happpy'

 2
Author: Xin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-10 01:22:04

To powinno zadziałać

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

insert into my_table values('hi, my name'+ @singleQuote +'s tim.')
 0
Author: Dave Kelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-04 20:41:59

Zgadzam się z Corym Larsonem. Kiedy używam SQL Server 2005 używam pojedynczego cudzysłowu do ucieczki pojedynczego cudzysłowu. Brzmi dziwnie, ale mi pasuje. Spróbuj z tym.

Reference: SQL Server 2005 escaping quotes

 -4
Author: user181945,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-27 17:25:19
string value = "Abhishek's";

value = Replace(value,"'","''");
 -8
Author: Abhishek Jaiswal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-05 01:18:52