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设置表变量的列值的主要内容,如果未能解决你的问题,请参考以下文章