Втеча символу в 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.