我正在SQL 2005上使用UPDATE游标:
DECLARE myCursor CURSOR FOR
SELECT RowID, Value FROM myTable
FOR UPDATE OF Value;
OPEN myCursor;
FETCH NEXT FROM myCursor
WHILE (@@FETCH_STATUS <> -1)
UPDATE myTable SET Value = 42
WHERE CURRENT OF myCursor
FETCH NEXT FROM myCursor
END
CLOSE myCursor
DEALLOCATE myCursor
(感谢Matt对my prior question关于这个游标语法的正确答案。是的,我确实需要一个游标,因为每一行的新值实际上都是基于一个依赖于前一行的复杂计算。 )
这可以正常工作,更新所有值。问题是它返回更新的每一行的结果集,包括RowID,Value(有趣的是,它在行更新之前显示的结果)。最终,我收到以下错误:
查询已超过最大值 可以的结果集数量 显示在结果网格中。只要 前100个结果集是 显示在网格中。
有什么方法可以抑制这些结果集? SET NOCOUNT ON
没有做到这一点。
这只是一个问题,我看到它直接在SSMS中运行吗?或者,当我将这个光标放在存储过程中时,它实际上会尝试返回数百个结果集吗?
编辑:看起来它与UPDATE无关。
使用FETCH NEXT FROM myCURSOR
实际上我确实会从光标返回下一行的结果集。
如果我将其更改为FETCH NEXT FROM myCURSOR INTO @variables
,则它不会返回结果集。
所以我想现在的问题是:因为我正在使用WHERE CURRENT OF
,所以我并不真正需要变量。我想我可以把它们放在仅仅是为了抑制结果集,但是有更好的方法吗?
答案 0 :(得分:2)
开始时注意...结束 并获取
Declare @row int
Declare @value int
DECLARE myCursor CURSOR FOR
SELECT RowID, Value FROM myTable
FOR UPDATE OF Value;
OPEN myCursor;
FETCH NEXT FROM myCursor into @row, @value
WHILE (@@FETCH_STATUS <> 1)
begin
UPDATE myTable SET Value = 42
WHERE CURRENT OF myCursor
FETCH NEXT FROM myCursor into @row, @value
END
CLOSE myCursor
DEALLOCATE myCursor