循环遍历表值函数

Posted

技术标签:

【中文标题】循环遍历表值函数【英文标题】:Loop through a table valued function 【发布时间】:2020-06-02 18:19:48 【问题描述】:

我有一个表x,其中有yz 列,它有10 行数据。

然后我有一个表值函数getDetails(y,z),它采用存储在表x 中的列yz 中的值返回一个包含三列的表tb

我需要编写一个 tsql 查询,通过函数 getDetails(y,z) 循环来自表 x 的值,以返回每组值 yzfrom 表 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.yx.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 |
+---+----+----+----+

【讨论】:

以上是关于循环遍历表值函数的主要内容,如果未能解决你的问题,请参考以下文章

动态循环遍历Python函数中的函数列表

使用 jQuery each() 函数循环遍历类名元素

循环遍历 jQuery 函数中的值

Excel VBA 函数循环遍历范围并测量多个相关性

循环递归遍历迭代的区别

C语言遍历目录中的文件