Как динамически добавить часть предложения where? - PullRequest
1 голос
/ 24 января 2020

У меня есть хранимая процедура. Мне нужно вставить текст прямо в предложение WHERE. Я действительно не хочу делать весь оператор SQL строкой и использовать подстановку макросов для его выполнения. Есть ли способ выполнить sh, что я хочу сделать ниже?

Я хочу вставить текст, начинающийся с && в предложении where. Значение @DispositionText может быть много вещей. Он снабжен чужой программой, с которой мне приходится работать. Например, фрагмент кода, который я отслеживаю прямо сейчас , показывает, что это значение: "and (Missing = 1)" Но это может быть любое количество условных проверок, которые вне моего контроля.

    @AssetDesc varchar (30) = null,
    @DispositionText varchar(200) = null

...
    select *
       from Equipment
       where Equipment.Description = @AssetDesc 
       &&@DispositionText
       order by AssetDesc

Ответы [ 2 ]

2 голосов
/ 24 января 2020

Слишком долго для комментария.

Переменные WHERE предложения, подобные этому, всегда находятся под угрозой для SQL инъекции, поэтому следует соблюдать осторожность при их реализации.

Dynami c SQL, как полагает Karamofrooz, обычно является наиболее целесообразным и самым опасным маршрутом, так что помните о Dos и Don'ts of Dynami c SQL.

Другой подход заключается в создании запроса «кухонная раковина» или «поймать все». Поиск по одному или обоим терминам будет искать много ресурсов, но эти два чертовски хорошее начало.

Dynami c Условия поиска в T-SQL

и

# BackToBasics: обновленный пример кухонной раковины

0 голосов
/ 24 января 2020

Вы можете сделать что-то вроде следующего кода и в конце использовать EXEC() как отправлено:

Declare @AssetDesc as varchar (30);
Declare @DispositionText as varchar(200);  
Declare @sqlCommand as varchar(1000);

SET @sqlCommand = 'select * from Equipment'
if(@AssetDesc <> NULL)
BEGIN
    SET @sqlCommand =  @sqlCommand + ' where Equipment.Description = ' + @AssetDesc;
    if(@DispositionText <> NULL)
    BEGIN
        SET @sqlCommand =  @sqlCommand + ' && ' + @DispositionText;
    END
End
Else if(@DispositionText <> NULL)
BEGIN
    SET @sqlCommand =  @sqlCommand + @DispositionText;
END

EXEC (@sqlCommand)

Этот подход называется Dynami c SQL. Обратите внимание на то, что у него есть 1006 * уязвимость против SQL инъекций атак.

...