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


95

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

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

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

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

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

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


4
Не могли бы вы показать нам запрос ??
— marc_s

Ответы:


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'

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

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


Это неверно. Скобки работают с недопустимыми символами в именах полей, таблиц или схем.
— Джейми Маршалл

Да, вы правы, это для имен объектов, а не для содержимого строки. Я должен неправильно истолковать вопрос.
— Бен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.