Как мне избежать одиночной кавычки в 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;
Просто вставьте 'перед тем, что нужно вставить. Это будет похоже на escape-символ в sqlServer
Пример: Когда у вас есть поле as, я в порядке. вы можете сделать: UPDATE my_table SET row ='Я в порядке.';
У меня была та же проблема, но моя основывалась не на статических данных в самом коде 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, я использую одинарную кавычку, чтобы избежать одиночной кавычки. Это звучит странно, но это работает для меня. Попробуй с этим.
string value = "Abhishek's";
value = Replace(value,"'","''");