Пользовательская функция SQL (и производительность): объединение SELECT и IF в нескольких операторах RETURN - PullRequest
2 голосов
/ 18 августа 2011

Причина моего вопроса отчасти связана с проблемами производительности.См. Примечание в конце.

Возможно ли сделать что-то вроде этого:

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» представляют внешние настройки.

Ответы [ 2 ]

1 голос
/ 19 августа 2011

Если есть желание, есть способ: -)

create function fn_x()
returns @x table
(
    col1 int,
    col2 varchar(20)
)
as
begin
    -- declare @Something1 ...

    if @Something1
        insert @x select ...
    else if @Something2
        insert @x select ...
    else
        insert @x select ...
    return
end
go

Замечание по производительности: от быстрого вызова до SET SHOWPLAN_ALL ON кажется, что оригинальный код bock 3 лучше, чем блок 2, но этот код выше - лучший.

1 голос
/ 18 августа 2011

Вы должны использовать альтернативы из-за синтаксиса: вы можете получить один возврат только с помощью встроенной табличной функции.

Лично я бы сказал, что разные СОЕДИНЕНИЯ означают отдельные функции ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...