TSQL设置表变量的列值

时间:2012-08-11 15:58:06

标签: tsql field iteration table-variable

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

仅仅为了完整性,使用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);

答案 2 :(得分:0)

为什么要使用游标呢?

为什么不写一些UPDATE语句:

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

    SET @counter = @counter + 1
END

您需要以某种方式从表变量中读出标识值(I),以便您可以在UPDATE语句中使用它更新到恰好一行(由I的值

标识)