Оголосити змінну у функції, що оцінюється в таблиці


110

Як я можу оголосити змінну у функції, що оцінюється в таблиці? (як у моєму назві)


вбудований чи мульти-висловлювання? Як MSDN описує їх?
gbn

Відповіді:


205

Є два смаки функцій, які оцінюються за столом. Один, який є лише оператором select, і те, що може мати більше рядків, ніж просто оператор select.

Це не може мати змінну:

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

33
Перший приклад відомий як «Інлайн Таблиця-функція» , який має перевагу в продуктивності по порівнянні з табл-функцією з декількома операторами, а саме сервер бази даних може перекомпонуйте запит з ITVF вбудовуваним в батьківському запит, по суті , стає параметрізіруется VIEWтоді як MSTVF поводиться більше як непрозора процедура зберігання (хоча і має свої переваги порівняно з проростками). Вбудованим функціям слід віддавати перевагу над MSTVF. Якщо вам потрібно обчислити та зберегти проміжні значення (наприклад, результат складного вираження скалярної функції), тоді використовуйте підзапит.
Дай

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

1
найбільша вартість - це вставка моєї функції, і я не знаю, як пропустити цю вартість, не вставляючи в таблицю змінну та повертаючи результат select
uzay95

@naughtilus, було б чудово бачити приклад цього. Чи обмірковували ви надати ще одну відповідь разом із вашою пропозицією?
Жак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.