web-dev-qa-db-ja.com

カーソルが存在するかどうかを確認する方法(オープンステータス)

カーソルが開いているかどうかを確認するにはどうすればよいですか?多くの場合、「カーソルは既に存在します」というエラーが発生するためです。カーソルがすでにオープン状態になっているかどうかを確認する方法を教えてください。

実際、私はそれを閉じて、最後にDeallocatedしました(CLOSE ppm_cursor; DEALLOCATE ppm_cursor;)しかし、それでも私は同じエラーを受け取っています。

35
Maddy

CURSOR_STATUS 関数を使用して、その状態を判別できます。

IF CURSOR_STATUS('global','myCursor')>=-1
BEGIN
 DEALLOCATE myCursor
END
80
Gary W

空の場合はカーソルを閉じてから、割り当てを解除します。

IF (SELECT CURSOR_STATUS('global','myCursor')) >= -1
 BEGIN
  IF (SELECT CURSOR_STATUS('global','myCursor')) > -1
   BEGIN
    CLOSE myCursor
   END
 DEALLOCATE myCursor
END
34
Prateek

「SELECT」を追加して、ゲイリーWが述べたことにわずかな変更を加えました。

IF (SELECT CURSOR_STATUS('global','myCursor')) >= -1
BEGIN
 DEALLOCATE myCursor
END

http://social.msdn.Microsoft.com/Forums/en/sqlgetstarted/thread/eb268010-75fd-4c04-9fe8-0bc33ccf9357

これは、SSMSで実行されているストアドプロシージャがループ中にエラーを検出し、レコードを閉じる前にカーソルがレコードを反復処理しているときに発生しました。これを修正するために、カーソルがまだ開いている場合にカーソルを閉じるためにCATCHブロックにコードを追加しました(ここで他の回答が示唆するようにCURSOR_STATUSを使用)。

0
Aaron

私はめったにカーソルを使用しませんが、ここであなたに噛みつくことができるもう1つのアイテム、カーソル名のスコープを発見しました。

データベースCURSOR_DEFAULTがグローバルである場合、特定の名前(たとえば、「cur」)でストアドプロシージャにカーソルを宣言すると、「カーソルは既に存在します」というエラーが発生します。同じ名前のカーソルを開きます(例:「cur」)。 「cur」を開こうとすると、ネストされたストアドプロシージャでエラーが発生します。

次のsqlを実行して、CURSOR_DEFAULTを確認します。

select is_local_cursor_default from sys.databases where name = '[your database name]'

この値が「0」の場合、ネストされたカーソルの命名方法は重要です。

0
Tom Regan