如何复用表值用户定义函数(tab-ufn)的调用结果?
复用表值函数结果(无需临时表)
对于你的需求,完全可以通过以下两种方式实现只调用一次表值函数并复用结果集,不需要使用临时表:
方式一:使用公共表表达式(CTE)
这是最简洁的方案,CTE会在查询执行阶段一次性计算函数结果,后续所有UNION分支直接复用该结果:
WITH TVF_Result AS ( -- 仅调用一次表值函数 SELECT * FROM dbo.ufn_tab(x, y) ) SELECT a, b, c FROM table1 JOIN TVF_Result ON <condition1> WHERE <condition2> UNION SELECT a, b, c FROM table2 JOIN TVF_Result ON <condition3> WHERE <condition4> UNION SELECT a, b, c FROM table3 JOIN TVF_Result ON <condition5> WHERE <condition6> UNION SELECT a, b, c FROM table4 JOIN TVF_Result ON <condition7> WHERE <condition8>
方式二:使用表变量
如果需要在更复杂的逻辑中复用结果,表变量是另一种选择——它属于内存级轻量级结构(按需写入tempdb),不属于临时表范畴:
-- 定义与表值函数返回结构完全匹配的表变量 DECLARE @TVF_Result TABLE ( -- 替换为ufn_tab实际返回的列名和数据类型 Column1 INT, Column2 VARCHAR(100), Column3 DATETIME, -- 其他列... ); -- 仅调用一次函数并将结果存入表变量 INSERT INTO @TVF_Result SELECT * FROM dbo.ufn_tab(x, y); -- 在UNION分支中复用表变量 SELECT a, b, c FROM table1 JOIN @TVF_Result ON <condition1> WHERE <condition2> UNION SELECT a, b, c FROM table2 JOIN @TVF_Result ON <condition3> WHERE <condition4> UNION SELECT a, b, c FROM table3 JOIN @TVF_Result ON <condition5> WHERE <condition6> UNION SELECT a, b, c FROM table4 JOIN @TVF_Result ON <condition7> WHERE <condition8>
说明
- SQL Server 2005及以上版本(你的非旧版环境完全支持)对CTE有原生优化,通常会确保函数只执行一次,性能优于多次调用函数。
- 表变量需要提前定义列结构,而CTE无需手动指定,更适合一次性查询场景。
内容的提问来源于stack exchange,提问作者pepr
相关产品推荐
相关产品推荐

