Использование условия для установки параметра в SQL

#sql #sql-server #syntax

#sql #sql-сервер #синтаксис

Вопрос:

Есть ли способ установить оператор OPTION на основе условия? Приведенный ниже код выполняется в хранимой процедуре. Оператор select — это всего лишь пример. Размещение параметра должно быть после оператора WHERE, но я получаю сообщение об ошибке при использовании оператора IF после WHERE .

Мне нужно что-то вроде этого:

 declare @time int = datepart(hh, getdate())

select * 
from my_table 
where x = something

if (@time > 8)  
 OPTION (LABEL = 'day')  
else
 OPTION (LABEL = 'night')  
end
  

Комментарии:

1. Какую СУБД вы используете? (Этот код не является ANSI / ISO SQL.)

2. MS SQL Server 2016

Ответ №1:

В основном у вас есть два варианта. Либо повторите SQL:

объявить @time int = datepart(hh, getdate());

 if @time > 8
    select *
    from my_table 
    where x = something
    OPTION (LABEL = 'day')  ;
else
    select *
    from my_table 
    where x = something
    OPTION (LABEL = 'night')  ;
  

Или используйте динамический SQL:

 declare @sql nvarchar(max);

set @sql = '
    select *
    from my_table 
    where x = something
    option (label = ''[label]'')
';

set @sql = replace(@sql, '[label]', case when @time > 8 then 'day' else 'night' end);

exec sp_executesql @sql;
  

Комментарии:

1. Есть ли недостаток в использовании динамического SQL. Я вижу много комментариев, жалующихся на динамический SQL.

2. @John . . . Это означает, что он анализируется при каждом выполнении. Его сложнее поддерживать. База данных не хранит информацию о зависимостях в определенных таблицах метаданных. Однако дублирование кода также создает проблемы с обслуживанием.

3. Спасибо за комментарии и ответ. Я принял это как ответ, потому что это кажется единственным жизнеспособным вариантом, хотя в конечном итоге я не использовал его напрямую. Моя хранимая процедура вызывается из VB.net сценарий. Поэтому я проверяю время суток с помощью этого, а затем вызываю соответствующую хранимую процедуру в SQL (которая в основном является копией с ПАРАМЕТРОМ, установленным так, как мне нужно в каждом из них).