Объявить переменную в функции с табличным значением


111

Как я могу объявить переменную в функции с табличным значением? (как в моем названии)


встроенный или многопользовательский? Как их описывает MSDN ?
gbn

Ответы:


207

Есть две разновидности табличных функций. Один - это просто оператор выбора, а другой может иметь больше строк, чем просто оператор выбора.

У этого не может быть переменной:

create function Func() returns table
as
return
select 10 as ColName

Вместо этого вы должны сделать так:

create function Func()
returns @T table(ColName int)
as
begin
  declare @Var int
  set @Var = 10
  insert into @T(ColName) values (@Var)
  return
end

34
Первый пример известен как «встроенная функция с табличным значением», которая имеет преимущества в производительности по сравнению с функцией с табличным значением с несколькими операторами, а именно сервер базы данных может перекомпоновать запрос с ITVF, встроенным в родительский запрос, по сути становясь параметризованным VIEWтогда как MSTVF ведет себя больше как непрозрачная хранимая процедура (хотя и со своими преимуществами по сравнению с sprocs). Встроенные функции должны быть предпочтительнее MSTVF. Если вам действительно нужно вычислить и сохранить промежуточные значения (например, результат сложного выражения скалярной функции), используйте подзапрос.
Дай,

1
Вероятно, также стоит упомянуть, что если результат того, что вы используете для заполнения переменной, которую вы хотите установить, каким-либо образом можно обобщить, вы можете подумать о написании отдельной функции для ее генерации. Это позволит вам использовать ITVF, описанный выше @Dai, со всеми его преимуществами, при этом вставляя динамически сгенерированное значение в вашу функцию. Я просто написал функцию с помощью вышеуказанного решения (спасибо @MikaelEriksson!), Которая передает один из своих параметров вспомогательной функции, чтобы избавить меня от необходимости использовать форму MSTVF.
naughtilus

1
самая большая стоимость - это вставка для моей функции, и я не знаю, как пропустить эту стоимость, не вставляя в таблицу переменную и не возвращая результат выбора
uzay95

@naughtilus, было бы здорово увидеть пример этого. Вы не думали дать еще один ответ вместе с вашим предложением?
Jacques
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.