Более элегантный способ избежать динамического 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)