FOR UPDATE游标返回每行的结果集!

时间:2010-12-22 16:05:53

标签: sql sql-server-2005 cursor

我正在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,所以我并不真正需要变量。我想我可以把它们放在仅仅是为了抑制结果集,但是有更好的方法吗?

1 个答案:

答案 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