我正在尝试迭代地设置表变量的各个列,如下所示:
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
上述方法不起作用,因为您无法像数组一样访问表变量。如何获得以下功能?
答案 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
的值