Как мне избежать одиночной кавычки в SQL Server?

Я пытаюсь insert некоторые текстовые данные в таблицу в SQL Server 9.

Текст включает в себя одну цитату (').

Как мне избежать этого?

Я попытался использовать две одинарные кавычки, но это привело меня к ошибкам.

например. insert into my_table values('hi, my name''s tim.');

18 ответов

Решение

Одиночные кавычки удаляются путем удвоения их, как вы показали нам в своем примере. Следующий SQL иллюстрирует эту функциональность. Я проверил это на SQL Server 2008:

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

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

SELECT * FROM @my_table

Результаты

value
==================
hi, my name's tim.

Если экранирование одной цитаты с другой одинарной цитатой не работает для вас (как это не было для одного из моих последних REPLACE() запросы), вы можете использовать SET QUOTED_IDENTIFIER OFF перед вашим запросом, то SET QUOTED_IDENTIFIER ON после вашего запроса.

Например

SET QUOTED_IDENTIFIER OFF;

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

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again

Как насчет:

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

Многие из нас знают, что популярный метод избавления от одиночных кавычек - легко удвоить их, как показано ниже.

PRINT 'It''s me, Arul.';

мы собираемся рассмотреть другие альтернативные способы избежать одинарных кавычек.

1. символы UNICODE

39 - это символ UNICODE для одинарных кавычек. Таким образом, мы можем использовать его, как показано ниже.

PRINT 'Hi,it'+CHAR(39)+'s Arul.';
PRINT 'Helo,it'+NCHAR(39)+'s Arul.';

2.QUOTED_IDENTIFIER

Еще одно простое и лучшее альтернативное решение - использовать QUOTED_IDENTIFIER. Когда QUOTED_IDENTIFIER имеет значение OFF, строки могут быть заключены в двойные кавычки. В этом сценарии нам не нужно избегать одинарных кавычек. Таким образом, этот способ был бы очень полезен при использовании большого количества строковых значений в одинарных кавычках. Это будет очень полезно при использовании большого количества строк сценариев INSERT/UPDATE, где значения столбцов имеют одинарные кавычки.

SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;

ВЫВОД

Вышеупомянутые методы применимы как к AZURE, так и к локальной сети.

2 способа обойти это:


за ' Вы можете просто удвоить его в строке, например select 'I''m happpy' -- will get: I'm happy


Для любого персонажа, в котором вы не уверены: на сервере sql вы можете получить юникод любого символа с помощью select unicode(':')

Так что в этом случае вы также можете select 'I'+nchar(39)+'m happpy'

Удвоение цитаты должно было сработать, поэтому странно, что оно не сработало для вас; однако альтернативой является использование двойных кавычек вместо одинарных символов вокруг строки. То есть,

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

Также следует обратить внимание на то, действительно ли он хранится как классический ASCII ' (ASCII 27) или Unicode 2019 (который выглядит аналогично, но не одинаково).

Это не имеет большого значения для вставок, но это может означать мир выбора и обновления.
Если это значение в юникоде, то экранирование 'в предложении WHERE (например, где blah = 'Workers''s Comp') вернет, что искомого значения не существует, если' в "Worker's Comp" на самом деле значение Юникода.

Если ваше клиентское приложение поддерживает ввод с произвольным ключом, а также ввод с копированием и вставкой, это может быть Unicode в одних строках и ASCII в других!

Простой способ подтвердить это - выполнить какой-то открытый запрос, который вернет искомое значение, а затем скопировать и вставить его в notepad++ или другой редактор, поддерживающий юникод.

Различный вид между значением ascii и значением unicode должен быть очевиден для глаз, но если вы склонитесь к анальному, он будет отображаться как 27 (ascii) или 92 (unicode) в шестнадцатеричном редакторе.

Мне помогла опция двойных кавычек

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

Следующий синтаксис избавит вас от ТОЛЬКО ОДНОЙ кавычки:

SELECT ''''

Результатом будет одинарная кавычка. Может быть очень полезно для создания динамического SQL:).

Просто вставьте 'перед тем, что нужно вставить. Это будет похоже на escape-символ в sqlServer

Пример: Когда у вас есть поле as, я в порядке. вы можете сделать: UPDATE my_table SET row ='Я в порядке.';

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

У меня была та же проблема, но моя основывалась не на статических данных в самом коде SQL, а на значениях в данных.

В этом коде перечислены все имена столбцов и типы данных в моей базе данных:

SELECT DISTINCT QUOTENAME(COLUMN_NAME),DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS

Но некоторые имена столбцов на самом деле содержат одинарные кавычки, встроенные в имя столбца!, например...

[MyTable].[LEOS'DATACOLUMN]

Чтобы обработать их, мне пришлось использовать функцию REPLACE вместе с предлагаемой настройкой QUOTED_IDENTIFIER. В противном случае это было бы синтаксической ошибкой, если столбец используется в динамическом SQL.

SET QUOTED_IDENTIFIER OFF;
    SET @sql = 'SELECT DISTINCT ''' + @TableName + ''',''' + REPLACE(@ColumnName,"'","''") + ...etc
SET QUOTED_IDENTIFIER ON;

Просто добавьте N перед значением

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

Это должно работать

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

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

STRING_ESCAPE Funtion можно использовать в новых версиях SQL Server

Это должно работать: использовать обратную косую черту и поставить двойную кавычку

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

Я согласен с Кори Ларсон. Когда я использую SQL Server 2005, я использую одинарную кавычку, чтобы избежать одиночной кавычки. Это звучит странно, но это работает для меня. Попробуй с этим.

Справка: экранирование кавычек SQL Server 2005

string value = "Abhishek's";

value = Replace(value,"'","''");
Другие вопросы по тегам