web-dev-qa-db-ja.com

@@ FETCH_STATUSにSCOPE_IDENTITYと同等の(または必要な)ものはありますか?

MSDNは、_@@FETCH_STATUS_はグローバルであるため、注意して使用することをお勧めします

@@ FETCH_STATUSは接続上のすべてのカーソルに対してグローバルであるため、@@ FETCH_STATUSは慎重に使用してください。 FETCHステートメントが実行された後、@@ FETCH_STATUSのテストは、他のFETCHステートメントが別のカーソルに対して実行される前に行われる必要があります。

これは私に2つの質問を導きます:

  1. 別の(ネストされていない)カーソルが私のカーソルと同時に実行され、_@@FETCH_STATUS_とWHILE条件の間の_FETCH NEXT_の値に影響を与える可能性はありますか?たとえば、他のカーソルが、スケジュールに従って呼び出されるストアドプロシージャ内にあるとします。
  2. これが可能な場合、_@@FETCH_STATUS_には_@@IDENTITY_のSCOPE_IDENTITY()と同等のものがありますか?
3
Eric Eskildsen
  1. ネストされていない限り、問題ありません。 @@ FETCH_STATUSは、FETCH NEXTが実行されるときに設定されます。 @@ FETCH_STATUSは、サーバー全体ではなく、セッションに対してグローバルです。
  2. @@ FETCH_STATUSのSCOPE_IDENTITY()に相当するものはありません。ループしたFETCH NEXT操作をネストする必要がある場合は、内側のループが完了した後に外側のFETCH NEXTが実行されるようにしてください。 FETCH NEXT操作をスタックする必要がある場合、またはFETCH NEXTを含む内部ループの前にFETCH NEXTを実行する必要がある場合は、ループの外で型intの一時変数を宣言し、一時変数を@@ FETCH_STATUSに等しく設定します。 FETCH NEXTステートメントの後、@@ FETCH_STATUSの代わりに一時変数をループ制御として使用します。
7
JamieSee

これありがとう!同様の問題がありました。カーソルを使用するプロシージャがありましたが、そのループ内で、カーソルを使用する別のプロシージャを呼び出しました。

私の解決策はローカル変数を使用することでした

DECLARE @MyFetchStatus int

その後、FETCH NEXTを行うたびに、

SET @MyFetchStatus = @@FETCH_STATUS. 

その後、ループを制御するために@MyFetchStatusのみを参照しました。

ありがとう!

0
Barry Seymour