0

@@FETCH_STATUS変数をリセットしたり、ストアド プロシージャで 0 に設定したりするにはどうすればよいですか?

また、FETCH_STATUS を特定のカーソルにバインドできますか?

4

8 に答える 8

3

私は@@FETCH_STATUSあなたが説明した問題DECLARECURSOR再現することができFETCH NEXTます@@FETCH_STATUS = -1.
次に、あなたCLOSEDEALLOCATEカーソルがあったとしても、それをコールCURSORバック@@FETCH_STATUS = -1し、に基づいてループ条件を設定した@@FETCH_STATUS <> -1場合、ループは実行されません。

私の解決策は、基本的CURSORに に戻るように指示し、 をFIRSTに変更し@@FETCH_STATUSてから0終了することでした。宣言時に名前の後にCURSORキーワードを追加して、スクロールできるようにする必要があることに注意してください。SCROLLCURSOR

これが例です。orderitems (人々が注文したアイテム) テーブルの 3 つの列を使用して、カーソルを作成しました。

USE transact_Sales;

GO

DECLARE @isOrderNumber INT;
DECLARE @isOrderTotal MONEY;
DECLARE test SCROLL CURSOR
FOR
SELECT Oi.order_num, SUM(Oi.quantity@item_price) FROM orderitems AS Oi GROUP BY order_num;

OPEN test;

WHILE @@FETCH_STATUS = 0
BEGIN 
FETCH NEXT FROM test INTO @isOrderNumber, @isOrderTotal
PRINT CAST(@isOrderNumber AS VARCHAR(20)) + ' '
     +CAST(@isOrderTotal AS VARCHAR(20)) + ' '
     +CAST(@@FETCH_STATUS AS VARCHAR(5))
END
FETCH FIRST FROM test INTO @isOrderNumber, @isOrderTotal

CLOSE test;
DEALLOCATE test;

結果は次のとおりです。

20005 149.87 0  
20006 55.00 0  
20007 1000.00 0  
20008 125.00 0  
20009 38.47 0  
20009 38.47 -1

カーソルは何度も実行でき、毎回同じ結果が生成されます。

于 2014-06-05T05:43:40.600 に答える
1

テーブルの最後にないカーソルを読み取ることでリセットできます。

于 2008-10-04T15:44:59.153 に答える
1

カーソルを閉じてから、カーソルを再度開く必要があります。

DECLARE @IDs int
DECLARE MyCursor CURSOR FOR(SELECT ID FROM Table)
OPEN MyCursor
FETCH NEXT FROM MyCursor INTO @IDs
WHILE @@FETCH_STATUS=0
BEGIN
    --Do your work(First loop)
FETCH NEXT FROM MyCursor INTO @IDs
END
CLOSE MyCursor
--Run the cursor again
OPEN MyCursor
FETCH NEXT FROM MyCursorINTO @IDs
WHILE @@FETCH_STATUS=0
BEGIN
    --Other work (Second loop)
    FETCH NEXT FROM MyCursor INTO @IDs
END
CLOSE MyCursor
DEALLOCATE MyCursor
于 2011-09-14T03:42:26.327 に答える
1

私が知っている古いスレッドですが、私のために働いた他の場所で見つかった答えは次のとおりです。

WHILE (1 = 1) 
BEGIN
    FETCH NEXT FROM mycursor INTO @somevar
    IF (@@FETCH_STATUS <> 0) BREAK
    -- do stuff here
END
于 2015-10-15T18:44:41.960 に答える
0

通常、FETCHの直後に@@ FETCH_STATUSがあるのに、なぜそれをリセットしたいのですか?

すぐに評価しない場合は、結果を一時変数に格納してみてください。

于 2008-10-07T22:40:01.293 に答える
0

カーソルをリセットする必要があると思ったことがありました。私はカーソルでいくつかのテストを行っていましたが、テストしていたカーソルへのクローズと割り当て解除をコーディングした後でも、@@fetch_status = -1 で戻ってきました。

何が起こったのかというと、論理テストの後に別の手順でグローバル カーソルを開き、そのカーソルを反復処理した後で決して閉じなかったということです。

したがって、Fetch はそのカーソルの @@Fetch_status を見ていました。

カーソルを閉じて、カーソルの割り当てを解除します。

于 2014-01-16T17:57:16.373 に答える
0

できません:

@@FETCH_STATUS (Transact-SQL)

接続によって現在開かれているカーソルに対して発行された最後のカーソルFETCH ステートメントのステータスを返します。

したがって、基本的にはカーソルにバインドされていません。

于 2008-10-04T16:04:31.563 に答える
0

カーソルをブレークしたい場合はBREAK
を使用できますが 、これは 0 から 1 への置換機能のみです。

fetch next
While @@fetch_Status = 0
begin

if (my condition)
 break
fetch next ;

end 
于 2010-10-11T14:22:43.720 に答える