カーソルが開いているかどうかを確認するにはどうすればよいですか?多くの場合、「カーソルは既に存在します」というエラーが発生するためです。カーソルがすでにオープン状態になっているかどうかを確認する方法を教えてください。
実際、私はそれを閉じて、最後にDeallocatedしました(CLOSE ppm_cursor; DEALLOCATE ppm_cursor;)しかし、それでも私は同じエラーを受け取っています。
CURSOR_STATUS 関数を使用して、その状態を判別できます。
IF CURSOR_STATUS('global','myCursor')>=-1
BEGIN
DEALLOCATE myCursor
END
空の場合はカーソルを閉じてから、割り当てを解除します。
IF (SELECT CURSOR_STATUS('global','myCursor')) >= -1
BEGIN
IF (SELECT CURSOR_STATUS('global','myCursor')) > -1
BEGIN
CLOSE myCursor
END
DEALLOCATE myCursor
END
「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を使用)。
私はめったにカーソルを使用しませんが、ここであなたに噛みつくことができるもう1つのアイテム、カーソル名のスコープを発見しました。
データベースCURSOR_DEFAULTがグローバルである場合、特定の名前(たとえば、「cur」)でストアドプロシージャにカーソルを宣言すると、「カーソルは既に存在します」というエラーが発生します。同じ名前のカーソルを開きます(例:「cur」)。 「cur」を開こうとすると、ネストされたストアドプロシージャでエラーが発生します。
次のsqlを実行して、CURSOR_DEFAULTを確認します。
select is_local_cursor_default from sys.databases where name = '[your database name]'
この値が「0」の場合、ネストされたカーソルの命名方法は重要です。