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.');
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.
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
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.')
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."
);
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.
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'
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.')
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
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,"'","''");
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