Причина моего вопроса отчасти связана с проблемами производительности.См. Примечание в конце.
Возможно ли сделать что-то вроде этого:
create function fn_x()
returns table
as
begin
if @Something1
return select distinct y.val, x.* from x join y on x.a = y.a where y.val = @val
else if @Something2
return select distinct z.val, x.* from x join z on x.a = z.a where z.val = @val
else
return select @val val, x.* from x
end
Альтернативой может быть что-то вроде этого:
return
select distinct y.val, x.* from x join y on x.a = y.a where @Something1 and y.val = @val
union all select distinct z.val, x.* from x join z on x.a = z.a where @Something2 and z.val = @val
union all select '' val, x.* from x where not @Something1 and not @Something2
или как это
return
select @val val, x.*
from x
where (not @Something1 and not @Something2)
or (@Something1 and exists(select * from y where x.a = y.a and y.val = @val))
or (@Something2 and exists(select * from z where x.a = z.a and z.val = @val))
Предположим, что "x" - это очень большая таблица, часто используемая.Меня беспокоит то, что альтернативы замедляют мои запросы.
(я использую SQL Server 2008 R2)
РЕДАКТИРОВАТЬ : Зачем мне нужна одна функция?Фильтр основан на внешних настройках (возможно, не идеальный, но обязательный).Короче говоря, есть функция замены таблицы.Вместо использования select * from x
теперь я должен использовать select * from fn_x()
.Таблицы «y» и «z» представляют таблицы разрешений, «@val» представляет идентификатор пользователя, а «@ Something1» и «@ Something2» представляют внешние настройки.