Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Написать Inline table-valued function


Автор: sergey_85 15.5.2011, 22:48
Привет!

Нужно реализовать такой запрос:

Код

select ... from ... where field in (dbo.fn_GetList(@param1))


Дело в том, что dbo.fn_GetList(@param1) должна возвращать в in  разные select'ы, в  зависимости от параметра ф-ции. 
Реализовать такое через процедуру не получиться, остаётся вариант с Inline table-valued function.


Но здесь непонятки, можно ли в теле Inline table-valued function ф-ции использовать конструкции IF ... ELSE, чтобы возвращать разный select, если нет, то как "выйти из ситуации", чтобы вызов работал в запросе с in?

Спасибо!

Автор: pengrad 1.6.2011, 16:34
Привет, даже не надо исхитряться. Твой select всегда должен возвращать одну колонку, именно так работает in(). Поэтому смело можно использовать обычную табличную функцию:

Код

create function dbo.fn_GetList(@param int)
returns @t TABLE (field int)
AS
begin    
    
    insert @t values(1)
    insert @t values(2)
    
    if (@param = 2) begin
      insert @t values(3)
      insert @t values(4)
    end
    
    return
end


Ну, и соответственно подправить немного вызов:

Код

select ... from ... where field in (select field dbo.fn_GetList(@param1))

Автор: Любитель 18.6.2011, 12:32
Код

select *
from t1
where t1.f1 in
(
  select t2.f1
  from t2
  where @param = 1

  union all

  select t3.f1
  from t3
  where @param = 2
)


Зачем дополнительная функция в данном случае?

Автор: pengrad 27.6.2011, 21:36
Так красивей с функцией, нет?)

Автор: Любитель 28.6.2011, 01:49
Нет. А с мультилайновой функцией - ещё и гарантировано медленнее.

Добавлено через 2 минуты и 26 секунд
По вопросу сабжа:
Цитата(sergey_85 @  15.5.2011,  22:48 Найти цитируемый пост)
Но здесь непонятки, можно ли в теле Inline table-valued function ф-ции использовать конструкции IF ... ELSE, чтобы возвращать разный select, если нет, то как "выйти из ситуации", чтобы вызов работал в запросе с in?

Именно if/else (императивные конструкции) - нельзя. Смысл инлайновой функции именно в том, что её можно заинлайнить, подставить в запрос (т. е. всегда можно обойтись без неё - тут просто вопрос, что быть может хочется дублирования избежать).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)