一千萬個為什麽

搜索

FOR UPDATE遊標返回每行的結果集!


我在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關於這個遊標語法的我之前的問題的正確答案是的,我確實需要一個遊標,因為每一行的新值實際上是基於一個復雜的計算,它取決於之前的行。)

這可以正常工作,更新所有值。問題是它返回更新的每一行的結果集,包括RowID,Value(有趣的是,它在行更新之前顯示的結果)。最終,我收到以下錯誤:

查詢已超過最大值   可以的結果集數量   顯示在結果網格中。只要   前100個結果集是   顯示在網格中。

有什麽方法可以抑制這些結果集? SET NOCOUNT ON 不起作用。 這只是一個問題,我看到它直接在SSMS中運行嗎?或者,當我將此光標放在存儲過程中時,它是否會嘗試返回數百個結果集?

編輯:看起來它與UPDATE無關。

使用 FETCH NEXT FROM myCURSOR ,實際上我確實從光標返回下一行的結果集。

如果我將其更改為 FETCH NEXT FROM myCURSOR INTO @variables ,則它不會返回結果集。

所以我想現在的問題是:因為我正在使用 WHERE CURRENT OF ,所以我並不真正需要變量。我想我可以將它們放入以抑制結果集,但是有更好的方法嗎?

最佳答案

開始時註意......結束 並進入

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

轉載註明原文: FOR UPDATE遊標返回每行的結果集!

猜你喜歡