@@FETCH_STATUS
変数をリセットしたり、ストアド プロシージャで 0 に設定したりするにはどうすればよいですか?
また、FETCH_STATUS を特定のカーソルにバインドできますか?
@@FETCH_STATUS
変数をリセットしたり、ストアド プロシージャで 0 に設定したりするにはどうすればよいですか?
また、FETCH_STATUS を特定のカーソルにバインドできますか?
私は@@FETCH_STATUS
あなたが説明した問題DECLARE
をCURSOR
再現することができFETCH NEXT
ます@@FETCH_STATUS = -1
.
次に、あなたCLOSE
とDEALLOCATE
カーソルがあったとしても、それをコールCURSOR
バック@@FETCH_STATUS = -1
し、に基づいてループ条件を設定した@@FETCH_STATUS <> -1
場合、ループは実行されません。
私の解決策は、基本的CURSOR
に に戻るように指示し、 をFIRST
に変更し@@FETCH_STATUS
てから0
終了することでした。宣言時に名前の後にCURSOR
キーワードを追加して、スクロールできるようにする必要があることに注意してください。SCROLL
CURSOR
これが例です。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
カーソルは何度も実行でき、毎回同じ結果が生成されます。
テーブルの最後にないカーソルを読み取ることでリセットできます。
カーソルを閉じてから、カーソルを再度開く必要があります。
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
私が知っている古いスレッドですが、私のために働いた他の場所で見つかった答えは次のとおりです。
WHILE (1 = 1)
BEGIN
FETCH NEXT FROM mycursor INTO @somevar
IF (@@FETCH_STATUS <> 0) BREAK
-- do stuff here
END
通常、FETCHの直後に@@ FETCH_STATUSがあるのに、なぜそれをリセットしたいのですか?
すぐに評価しない場合は、結果を一時変数に格納してみてください。
カーソルをリセットする必要があると思ったことがありました。私はカーソルでいくつかのテストを行っていましたが、テストしていたカーソルへのクローズと割り当て解除をコーディングした後でも、@@fetch_status = -1 で戻ってきました。
何が起こったのかというと、論理テストの後に別の手順でグローバル カーソルを開き、そのカーソルを反復処理した後で決して閉じなかったということです。
したがって、Fetch はそのカーソルの @@Fetch_status を見ていました。
カーソルを閉じて、カーソルの割り当てを解除します。
できません:
@@FETCH_STATUS (Transact-SQL)
接続によって現在開かれているカーソルに対して発行された最後のカーソルFETCH ステートメントのステータスを返します。
したがって、基本的にはカーソルにバインドされていません。
カーソルをブレークしたい場合はBREAK
を使用できますが
、これは 0 から 1 への置換機能のみです。
fetch next
While @@fetch_Status = 0
begin
if (my condition)
break
fetch next ;
end