【问题标题】:TSQL set the column value of a table variableTSQL设置表变量的列值
【发布时间】:2012-08-11 15:58:05
【问题描述】:

我正在尝试迭代设置表变量的各个列,如下所示:

declare @reg_data table
(
    I int NOT NULL PRIMARY KEY IDENTITY,
    Y float
)

declare @counter int, @numRows int
SET @counter = 0
SET @numRows = (select MAX(val) + 10 from tableY)

WHILE @counter < numRows
BEGIN
    SET @reg_data.Y = dbo.func1(@counter)       --HOW DO I DO THIS!!!  
    @counter = @counter + 1
END

上述方法不起作用,因为您无法像数组一样访问表变量。如何获得以下功能?

【问题讨论】:

    标签: tsql field iteration table-variable


    【解决方案1】:

    您不能在不存在的记录中设置值,因此您需要insert

    WHILE @counter < numRows
    BEGIN
        INSERT INTO @reg_data (Y) values (dbo.func1(@counter))
        @counter = @counter + 1
    END
    

    【讨论】:

      【解决方案2】:

      为了完整起见,一个带有 CTE 且没有循环的单语句示例:

      DECLARE @reg_data TABLE (
          I INT NOT NULL PRIMARY KEY IDENTITY,
          Y FLOAT
      );
      
      WITH cteNum AS (
          SELECT MAX(val) + 10 AS val
          FROM @tableY
          HAVING MAX(val) >= 0
          UNION ALL
          SELECT val-1
          FROM cteNum
          WHERE val > 0
      )
      INSERT @reg_data(Y)
          SELECT dbo.func1(val)
          FROM cteNum
          OPTION (MAXRECURSION 0);
      

      【讨论】:

        【解决方案3】:

        为什么要为此使用光标?

        你为什么不写一些UPDATE声明:

        WHILE @counter < numRows
        BEGIN
            UPDATE @reg_data
            SET Y = dbo.func1(@counter)  
            WHERE I = @counter
        
            SET @counter = @counter + 1
        END
        

        您需要能够以某种方式从表变量中读出 identifying 值(I),这样您就可以在您的 UPDATE 语句中使用它来准确地应用更新一行(由I 的值标识)

        【讨论】:

        • 这基本上是我想要的,但我想遍历 I 直到它到达@numRows
        • 看起来不错!!问题是我还没有 reg_data.I 的值...如何提前填充 reg_data.I 以成为从 0 到 @numRows 的整数步长?
        • @CodeKingPlusPlus:看起来 Guffa 的答案可能更符合您的要求!
        猜你喜欢
        • 2017-04-16
        • 2019-11-09
        • 1970-01-01
        • 1970-01-01
        • 2018-02-04
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 2014-08-09
        相关资源
        最近更新 更多