2012-08-11 96 views
0

表我想重复设置表变量的各列如下的列值:TSQL设置变量

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 
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该值确定)

+0

这基本上是我想要的,但我想通过我,直到它到达@numRows – CodeKingPlusPlus 2012-08-11 16:03:30

+0

迭代@ CodeKingPlusPlus:更新我的回复 – 2012-08-11 16:04:47

+0

看起来不错!问题是我没有reg_data.I值没有...我怎么能填充reg_data.I提前是从0到@numRows的整数步骤? – CodeKingPlusPlus 2012-08-11 16:08:12

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);