Втеча символу в SQL Server


95

Я хочу використовувати лапку з символом втечі. Як я можу зробити?

Я отримав помилку в SQL Server

Незакрита лапка після рядка символів.

Я пишу запит SQL у varcharзмінну, але я отримав цю помилку:

Незакрита лапка після рядка символів.

Я хочу використати лапки як вхідний знак.


4
Чи можете ви, будь ласка, показати нам запит ??
marc_s

Відповіді:


78

Щоб уникнути, 'вам просто потрібно поставити ще один перед:''

Як показує друга відповідь, можна уникнути одинарних лапок таким чином:

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

Це не відповідає на питання. Іноді користувачеві потрібне з'єднання ODBC, що означає, що ви можете використовувати лише чистий SQL.
Тоні

Відредагована відповідь на більш чітке та відповідне запитання
Оновлений

122

Ви можете уникнути цитати таким чином:

select 'it''s escaped'

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

it's escaped

Це має бути відповіддю.
Тоні

45

Ви можете визначити свого символу втечі, але ви можете використовувати його лише з 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

Якщо ви хочете проникнути всередину подібного оператора, то вам потрібно використовувати синтаксис ESCAPE

Варто також згадати, що ви залишаєтеся відкритим для атак SQL-ін'єкцій, якщо не вважаєте цього. Більше інформації в Google або: http://it.toolbox.com/wiki/index.php/How_do_I_escape_single_quotes_in_SQL_queries%3F


і все ж відповіді від dugokontov або RichardPianka не мають подібних -1?
Seph

@MichaelMunsey спробуйте самі: select 'повертає помилку Unclosed quotation mark after the character string ''. Ніде у своїй відповіді я не використовую "лише дві ', не впевнений, чому моя єдина відповідь із голосами проти.
Сеф

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.