Более элегантный способ избежать динамического SQL?
ОК, поэтому я получил эту строку кода в хранимой процедуре поиска:
SET @where = 'job_code = ''' + REPLACE(@job_code, '''', '''''') + ''''
и в основном две операции, которые я бы хотел оптимизировать - , первая из которых была связана с конкатенированным значением в одинарных кавычках. Очевидно, что в приведенном выше выражении я избегаю '
используя два ''
, а затем завершая строку с помощью '
, чтобы я мог связать фактическое значение. Там должен быть лучший способ!
Второй из операций будет REPLACE(@job_code, '''', '''''')
, где я избегаю каких-либо одиночных кавычек, которые могут существовать в поле.
Разве нет более элегантного способа написания этой строки кода в целом?
Я думал, что это ключевое слово ESCAPE
, но тесно связанное с оператором LIKE
, поэтому туда не переходите.
Ответы
Ответ 1
Не уверен, как вы выполняете свой SQL-запрос, если используете sp_executesql, может быть что-то вроде этого
EXECUTE sp_executesql
N'SELECT * FROM YouTable WHERE job_code = @job_code',
N'@job_code varchar(100)',
@job_code = @job_code;
Ответ 2
Параметрированный ответ на запрос, вероятно, является реальным "правильным ответом", но для ответа на ваш оригинальный вопрос, вы хотите QUOTENAME(). Более конкретно, версия с одной кавычкой:
SET @where = 'job_code = ' + QUOTENAME(@job_code, '''')
Обратите внимание на ограничение длины на этом (ввод - sysname
, что означает 128 символов), хотя, как предполагается, указывать имена объектов базы данных, а не как механизм общего назначения.
Ответ 3
Вы можете объявлять константы:
declare @SQ as char(1) = ''''
SET @where = 'job_code = ' + @SQ + REPLACE(@job_code, @SQ, @SQ + @SQ) + @SQ
Ответ 4
Вы можете определить функцию, которая обрабатывает ваши типичные сценарии, например:
create function WrapAndReplaceQuotes (@input as varchar(max))
returns varchar(max)
as
begin
return '''' + replace(@input, '''', '''''') + ''''
end
SET @where = 'job_code = ' + WrapAndReplaceQuotes(@job_code)