【问题标题】: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

//更新 如果有人知道如何使用临时表来实现这一点,请告诉我

【问题讨论】:

  • 不要认为这是“循环”。可以将其想象为您想从函数中检索输入表中行集的值。

标签: sql sql-server loops tsql user-defined-functions


【解决方案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 |
    +---+----+----+----+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多