TSQL设置表变量的列值

Posted

技术标签:

【中文标题】TSQL设置表变量的列值【英文标题】:TSQL set the column value of a table variable 【发布时间】: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

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

【问题讨论】:

【参考方案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 的答案可能更符合您的要求!

以上是关于TSQL设置表变量的列值的主要内容,如果未能解决你的问题,请参考以下文章

计算由另一列值分组的列值在 pandas 数据框中的共现

TSQL--临时表和表变量

TSQL 何时为存储过程中的变量(和表变量)分配内存

如何根据jQuery数据表中的列值设置表行的颜色

基于另一个列值合并列值 - SQL

cte tsql 使用变量