在表值函数中声明变量


Answers:


205

表值函数有两种。一个仅是一条选择语句,而另一条可以具有比仅一条选择语句更多的行。

这不能有一个变量:

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 来重组查询,从本质上成为参数化而MSTVF的行为更像是不透明的存储过程(尽管与存储过程相比,它具有自己的优势)。内联功能应优于MSTVF。如果确实需要计算和存储中间值(例如复杂的标量函数表达式的结果),请使用子查询。VIEW
2013年

1
可能还值得一提的是,如果用于填充要设置的变量的结果可以通用,那么您可以考虑编写一个单独的函数来生成它。这将允许您使用上面@Dai所述的ITVF,并具有其所有优点,同时仍将动态生成的值插入函数中。我只是在上述解决方案的帮助下编写了一个函数(谢谢@MikaelEriksson!),该函数将其参数之一传递给了一个辅助函数,以免我不得不使用MSTVF表单。
顽皮

1
最大的开销是为函数插入,我不知道如何在不插入表变量的情况下跳过此开销并返回select的结果
uzay95

@naughtilus,很高兴看到这样的例子。您是否考虑过提供其他答案以及建议?
雅克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.