#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 (которая в основном является копией с ПАРАМЕТРОМ, установленным так, как мне нужно в каждом из них).