Ответы:
Есть две разновидности табличных функций. Один - это просто оператор выбора, а другой может иметь больше строк, чем просто оператор выбора.
У этого не может быть переменной:
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
VIEW
тогда как MSTVF ведет себя больше как непрозрачная хранимая процедура (хотя и со своими преимуществами по сравнению с sprocs). Встроенные функции должны быть предпочтительнее MSTVF. Если вам действительно нужно вычислить и сохранить промежуточные значения (например, результат сложного выражения скалярной функции), используйте подзапрос.