web-dev-qa-db-ja.com

SQLカーソルフェッチステータスの意味

次の行の意味がわかりません。

   WHILE 1 = 1 
   BEGIN
      FETCH NEXT FROM SomeCursor INTO @SomeId, @SomeOtherColumn

      IF @@FETCH_STATUS <> 0 BREAK

While 1 = 1の意味は何ですか?フェッチステータスが0と異なる場合は?

ありがとう

8
Volkan

1 = 1は、常にtrueを返す短い条件です。つまり、永久にループします(まあ、他の場所で抜け出すまで)。

フェッチステータス値に関しては、いつものように、MSDNはここであなたの友達です。から https://msdn.Microsoft.com/en-us/library/ms187308.aspx

  • 0 = FETCHステートメントは成功しました。
  • -1 = FETCHステートメントが失敗したか、行が結果セットを超えていました。
  • -2 =フェッチされた行がありません。

例えば。 0以外のものを取得した場合は、問題が発生しているため、続行しても意味がありません。

ちなみに、MSDNは、これはレガシーなものであり、@@FETCH_STATUSはグローバルであるため、複数のカーソルが使用されている場合は信頼されないことにも注意しています。代わりに、sys.dm_exec_cursors動的管理関数からカーソルの個々のフェッチステータス値を検索します。

10
Bridge

WHILE 1=1はループの始まりであり、常にTRUEの結果になります。したがって、ループが開始されます(そして、永久に続く可能性があります)。

@@FETCH_STATUSは、カーソルからフェッチされる(またはフェッチされた)行がまだあるかどうかを示します。

カーソルからフェッチできる行がまだある場合、@@FETCH_STATUSは0であり、[〜#〜] success [〜#〜]

@@FETCH_STATUS<> 0(-1または-2)の場合、から返される行がこれ以上ないことを示します。カーソルとあなたはその終わりに達しました。

これは、カーソルを超えているループから抜け出すために使用される通常の条件です。

@Lamakがコメントしたように、ここに @@ FETCH_STATUSのドキュメント があります。

9
Radu Gheorghiu

これは、コードにFETCH NEXT行を2回記述しないようにするために一般的に使用されるトリックです。 WHILE 1 = 1を介して無限ループを開始し、@@FETCH_STATUSが0以外のものを返すまで続きます。これは、カーソルの終わりに到達したか、エラーが発生したことを示します。

可能な@@FETCH_STATUS値は次のとおりです。

Return value    Description
0               The FETCH statement was successful.
-1              The FETCH statement failed or the row was beyond the result set.
-2              The row fetched is missing.
4
Siyual