Экранирующий символ в SQL Server

95

Я хочу использовать кавычки с escape-символом. Как я могу сделать?

Я получил ошибку в SQL Server

Незакрытые кавычки после символьной строки.

Я пишу SQL-запрос в varcharпеременной, но получил эту ошибку:

Незакрытые кавычки после символьной строки.

Я хочу использовать кавычки в качестве escape-символа.

esquare
источник
4
Не могли бы вы показать нам запрос ??
marc_s
2
Возможный дубликат Как избежать одиночной кавычки в SQL Server?
Jens Schauder

Ответы:

79

Чтобы сбежать, 'вам просто нужно поставить еще один перед:''

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

select 'it''s escaped'

результат будет

it's escaped

Если вы объединяете SQL в VARCHAR для выполнения (т.е. динамический SQL), я бы рекомендовал параметризовать SQL. Это помогает защититься от SQL-инъекций, а также означает, что вам не нужно беспокоиться об экранировании подобных кавычек (что вы делаете, удваивая кавычки).

например, вместо того, чтобы делать

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = ''AAA'''
EXECUTE(@SQL)

попробуй это:

DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'SELECT * FROM MyTable WHERE Field1 = @Field1'
EXECUTE sp_executesql @SQL, N'@Field1 VARCHAR(10)', 'AAA'
AdaTheDev
источник
30
Почему это принятый ответ? Это не отвечает на вопрос.
Питер Мур
3
@PeterMoore Либо OP использовал бы 1-ю часть моего ответа (удвоение кавычек, согласно другим ответам ниже), либо использовал бы предпочтительный подход, который я рекомендовал для создания SQL-запроса в строковой переменной - использовать параметризованные SQL. В любом случае, оба являются ответами на вопрос
AdaTheDev 05
Это не отвечает на вопрос. Иногда пользователю требуется соединение ODBC, что означает, что вы можете использовать только чистый SQL.
Тони
Отредактированный ответ на более ясный и более подходящий вопрос
Revious
123

Вы можете избежать цитаты следующим образом:

select 'it''s escaped'

результат будет

it's escaped
дугоконтов
источник
Это должен быть ответ.
Тони
46

Вы можете определить свой escape-символ, но вы можете использовать его только с LIKEпредложением.

Пример:

SELECT columns FROM table
WHERE column LIKE '%\%%' ESCAPE '\'

Здесь он будет искать по %всей строке, и вот как можно использовать ESCAPEидентификатор в SQL Server.

Аникет А
источник
21

Вам нужно просто заменить 'на ''внутри своей строки

SELECT colA, colB, colC
FROM tableD
WHERE colA = 'John''s Mobile'

Вы также можете использовать, REPLACE(@name, '''', '''''')если генерируете SQL динамически

Если вы хотите избежать внутри оператора like, вам необходимо использовать синтаксис ESCAPE

Также стоит упомянуть, что вы оставляете себя уязвимым для атак SQL-инъекций, если не учитываете это. Дополнительная информация в Google или: http://it.toolbox.com/wiki/index.php/How_do_I_escape_single_quotes_in_SQL_queries%3F

Сеф
источник
а в ответах дугоконтов или Ричарда Пьянки нет похожих -1?
Seph
@MichaelMunsey попробуйте сами: select 'возвращает ошибку Unclosed quotation mark after the character string ''. Я нигде в своем ответе не использую "только два ', не зная, почему мой единственный ответ с отрицательными голосами.
Seph
12

Экранирующие кавычки в MSSQL выполняются с помощью двойных кавычек, поэтому a ''или a ""создадут одну экранированную 'и ", соответственно.

Ричард Пьянка
источник
0

Вы можете использовать **\**символ перед значением, которое хотите избежать, например insert into msglog(recipient) values('Mr. O\'riely') select * from msglog where recipient = 'Mr. O\'riely'

парадокс землянин
источник
0

Если вы хотите избежать ввода пользователя в переменную, вы можете сделать, как показано ниже, в SQL

  Set @userinput = replace(@userinput,'''','''''')

@Userinput теперь будет экранирован дополнительной одиночной кавычкой для каждого появления цитаты.

Наяджив
источник
-2

Чтобы код было легко читать, вы можете использовать квадратные скобки []для заключения строки, содержащей его, 'или наоборот.

Бен
источник
Это неверно. Скобки работают с недопустимыми символами в именах полей, таблиц или схем.
Джейми Маршалл
Да, вы правы, это для имен объектов, а не для содержимого строки. Я должен неправильно истолковать вопрос.
Бен