【问题标题】:Declare variable in table valued function在表值函数中声明变量
【发布时间】:2011-10-03 10:34:43
【问题描述】:

如何在表值函数中声明变量? (就像我的标题一样)

【问题讨论】:

  • 内联语句还是多语句?像 MSDN 描述的那样吗?

标签: sql-server function user-defined-functions


【解决方案1】:

有两种类型的表值函数。一个只是一个 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

【讨论】:

  • 第一个例子被称为“内联表值函数”,与多语句表值函数相比,它具有性能优势,即数据库服务器可以recompose将 ITVF 内联 的查询放入父查询中,本质上成为参数化的VIEW,而 MSTVF 的行为更像是一个不透明的存储过程(尽管与存储过程相比有其自身的优势)。内联函数应优先于 MSTVF。如果确实需要计算和存储中间值(例如复杂标量函数表达式的结果),请使用子查询。
  • 可能还值得一提的是,如果您用来填充您希望设置的变量的任何结果都是可推广的,那么您可以考虑编写一个单独的函数来生成它。这将允许您使用上面@Dai 描述的 ITVF 及其所有好处,同时仍将动态生成的值插入到您的函数中。我刚刚在上述解决方案的帮助下编写了一个函数(谢谢@MikaelEriksson!),它把它的一个参数传递给一个辅助函数,这样我就不必使用 MSTVF 表单了。
  • 最大的成本是为我的函数插入,我不知道如何跳过这个成本而不插入表变量并返回选择结果
  • @naughtilus 很高兴看到这样的例子。您是否考虑过提供其他答案以及您的建议?
猜你喜欢
  • 1970-01-01
  • 2011-05-12
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 2015-01-13
相关资源
最近更新 更多