在表值函数中声明变量

136
如何在表值函数中声明变量?

内联或多语句?像MSDN所描述的那样? - gbn
2个回答

258
有两种表值函数。一种仅是选择语句,另一种可以比选择语句多出更多的行。
这不能有一个变量:
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

49
第一个例子被称为“内联表值函数”,与多语句表值函数相比具有性能优势,即数据库服务器可以将ITVF“内联”到父查询中,并重新组合查询,从而基本上成为一个参数化的“视图”,而MSTVF更像是一个不透明的存储过程(虽然它也有自己的优点)。应该首选内联函数而不是MSTVF。如果您确实需要计算和存储中间值(例如复杂标量函数表达式的结果),则应使用子查询。 - Dai
3
值得一提的是,如果您用于填充要设置的变量的结果可以在任何情况下进行泛化,那么您可以考虑编写一个单独的函数来生成它。这将允许您使用@Dai上面描述的ITVF,并获得所有相关的好处,同时仍然将动态生成的值插入到函数中。我刚刚借助上述解决方案(感谢@MikaelEriksson!)编写了一个函数,将其参数之一传递给辅助函数,以避免使用MSTVF形式。 - naughtilus
1
最大的成本是在我的函数中进行插入,我不知道如何跳过这个成本而不插入到表变量并返回选择结果。 - uzay95
@naughtilus,看到一个例子会很好。您是否考虑提供另一个答案以及您的建议? - Jacques

1

在SQL Server中:

这不是一个很好的解决方案,但如果您有使用内联TVF而不是MSTVF的有效原因,并且无法将变量作为参数传递到TVF中,但可以使用SELECT语句获取它,则可以使用CTE来访问该值,如下所示:

CREATE FUNCTION func()
RETURNS TABLE
AS 
RETURN
(
-- Create a CTE table containing just the required value
WITH cte_myVar AS
   (SELECT <statement to select variable>) col1

-- Use the value by selecting it from the CTE table
SELECT * FROM table1 t1
WHERE t1.col1 = (SELECT col1 FROM cte_myVar)

)



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接