Экранирующий символ в 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.