循环遍历表值函数
Posted
技术标签:
【中文标题】循环遍历表值函数【英文标题】:Loop through a table valued function 【发布时间】:2020-06-02 18:19:48 【问题描述】:我有一个表x
,其中有y
和z
列,它有10 行数据。
然后我有一个表值函数getDetails(y,z)
,它采用存储在表x
中的列y
和z
中的值返回一个包含三列的表tb
。
我需要编写一个 tsql 查询,通过函数 getDetails(y,z)
循环来自表 x
的值,以返回每组值 y
和 z
from 表 x
的一行在这种情况下,表 tb
应该有 10 行。
这是我目前所拥有的,每次运行时只返回一行。
DECLARE @y NVARCHAR(50);
DECLARE @z NVARCHAR(2);
SELECT @y =y FROM x
SElECT @z =z FROM x
SELECT * from getDetails(@y,@z)
返回
col1 col2 col3
---------------------
row1 Lorem Ipsum Sit
//更新 如果有人知道如何使用临时表来实现这一点,请告诉我
【问题讨论】:
不要认为这是“循环”。可以将其想象为您想从函数中检索输入表中行集的值。 【参考方案1】:如果您愿意一次获得所有结果,我会在此处使用CROSS APPLY
。
SELECT
d.col1,
d.col2,
d.col3
FROM x
CROSS APPLY dbo.getDetails (x.y, x.z) AS d;
这将一次性返回完整的数据集。如果您需要/希望在结果中使用这些值,也可以将 x.y
和 x.z
添加到 SELECT
子句中。
【讨论】:
【参考方案2】:您正在尝试为表 x 的每一行调用用户定义的函数。你不需要循环,你可以自己进行基于集合的操作。
下面我正在创建表用户定义函数,它返回一个包含 3 列的表。
create FUNCTION dbo.testtableresult(@a int)
returns table as
return
select @a+1 as a1, @a+2 as a2, @a+3 as a3
我将两行加载到表变量中,然后为每一行调用用户定义的函数。
DECLARE @table table(a int)
INSERT INTO @table values(1),(2)
SELECT t.a, t1.a1, t1.a2, t1.a3
FROM @table as t
CROSS APPLY dbo.testtableresult(t.a) as t1
+---+----+----+----+
| a | a1 | a2 | a3 |
+---+----+----+----+
| 1 | 2 | 3 | 4 |
| 2 | 3 | 4 | 5 |
+---+----+----+----+
【讨论】:
以上是关于循环遍历表值函数的主要内容,如果未能解决你的问题,请参考以下文章