SQL Escape '' - PullRequest
       47

SQL Escape ''

5 голосов
/ 30 июня 2009

Я пытаюсь выполнить запрос в SQL 2008, выполнив:

@query varchar(max)

SET @query = 'SELECT * FROM Table WHERE [Name] = ' 'Karl' ' '

EXEC(@query)

Проблема в том, что по какой-то причине апострофы вокруг 'Karl' не экранируются, то есть запрос выполняется как ...WHERE [Name] = Karl и завершается неудачей.

У кого-нибудь есть предложение?

Спасибо

Karl

Ответы [ 7 ]

3 голосов
/ 30 июня 2009

Есть несколько способов избежать символьных данных в SQL Server, некоторые люди даже рекомендуют использовать функции QUOTENAME () .

Если вы действительно хотите развить глубокое понимание этой предметной области, то я могу порекомендовать вам взглянуть на то, что опытные разработчики SQL Server считают необходимым прочтением, с точки зрения различных методов, которые вы можете использовать для включения Dynamic T- SQL в вашу кодировку.

Проклятие и благословения динамического SQL

2 голосов
/ 30 июня 2009

Попробуйте:

DECLARE @query varchar(max)

SET @query = 'SELECT * FROM Table WHERE [Name] = ''Karl'''

PRINT 'when in doubt, print the query out: '+ISNULL(@query,'')
EXEC(@query)

Чтобы появилась одинарная кавычка, вам нужно иметь две соседние одинарные кавычки. Вы избегаете одиночной кавычки с одной кавычкой, например:

PRINT ''''     --will print a one single quote
PRINT ''''''   --will print two single quotes
PRINT 'can''t' --will print can't
2 голосов
/ 30 июня 2009

Это работает на моем компьютере из SQL Server Management Studio:

@query varchar(max)

SET @query = 'SELECT * FROM Table WHERE [Name] = ''''''Karl'''''''

EXEC(@query)
1 голос
/ 30 июня 2009

Двойная одинарная кавычка ('') будет действовать как одиночная кавычка внутри строкового литерала.

Вы пытались использовать переменную?

declare @karl_name varchar(10);
set @karl_name = '''Karl''';

SELECT * FROM Table WHERE [Name] = @karl_name
0 голосов
/ 30 июня 2009

Это работает:

create table #demo([Name] varchar(max))
insert into #demo([Name]) values('''Karl''')
insert into #demo([Name]) values('Karl')
declare @query varchar(max)
set @query = 'SELECT * FROM #demo WHERE [Name] = ''''''Karl'''''''
EXEC(@query)

Выход:

'Karl'

Но если 'Karl' является переменным текстом, настоятельно рекомендуется использовать что-то вроде этого:

declare @query nvarchar(max)
declare @param varchar(max)
set @param = N'''Karl'''
set @query = N'SELECT * FROM #demo WHERE [Name] = @param'
exec sp_executesql @query, N'@param varchar(max)', @param
0 голосов
/ 30 июня 2009

Просто избегайте апострофов, используя выходящую черту \ как этот 'SELECT * FROM Table WHERE [Name] =' \ 'Karl \' ''

Надеюсь, это поможет

0 голосов
/ 30 июня 2009

делай так SET @query = 'SELECT * ИЗ таблицы WHERE [Имя] =' '' 'Карл' '' ''

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...