DEALLOCATE (Transact-SQL)

カーソル参照を削除します。最後のカーソル参照の割り当てが解除されると、カーソルを構成するデータ構造は、MicrosoftSQL Server によって解放されます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }

引数

  • cursor_name
    宣言済みのカーソル名を指定します。cursor_name という名前のカーソルとして、グローバル カーソルとローカル カーソルの両方がある場合は、GLOBAL を指定すると cursor_name ではグローバル カーソルが参照され、GLOBAL を指定しないとローカル カーソルが参照されます。

  • @cursor_variable_name
    cursor 変数の名前を指定します。@cursor_variable_name は、cursor 型であることが必要です。

説明

カーソルを操作するステートメントでは、カーソル名またはカーソル変数を使用してカーソルを参照します。DEALLOCATE を実行すると、カーソルと、カーソル名またはカーソル変数との間の関係が削除されます。名前または変数がカーソルを参照する最後のものである場合は、カーソルの割り当てが解除され、カーソルが使用しているリソースが解放されます。フェッチの孤立を防ぐために使用するスクロール ロックは、DEALLOCATE で解放されます。カーソルを介して行われる位置指定更新を含め、更新を保護するために使用するトランザクション ロックは、トランザクションの終了時まで保持されます。

DECLARE CURSOR ステートメントでは、カーソルを割り当て、カーソル名と関連付けます。

DECLARE abc SCROLL CURSOR FOR
SELECT * FROM Person.Contact

カーソルにカーソル名が割り当てられると、このカーソルの割り当てが解除されるまで、その名前を同じ範囲 (GLOBAL または LOCAL) の別のカーソルに対して使用することはできません。

カーソル変数は、次のいずれかの方法でカーソルに関連付けられます。

  • カーソルをカーソル変数に設定する SET ステートメントを使用して、名前を指定する。

    DECLARE @MyCrsrRef CURSOR
    SET @MyCrsrRef = abc
    
  • カーソル名を定義せずにカーソルを作成し、変数に関連付ける。

    DECLARE @MyCursor CURSOR
    SET @MyCursor = CURSOR LOCAL SCROLL FOR
    SELECT * FROM Person.Contact
    

DEALLOCATE @cursor_variable_name ステートメントでは、カーソルに対し、指定した変数の参照だけを削除します。変数の割り当ては、バッチ、ストアド プロシージャ、またはトリガの終了時にその有効範囲が失われるまで、解除されることはありません。DEALLOCATE @cursor_variable_name ステートメントの後で SET ステートメントを使用して、変数を別のカーソルに関連付けることもできます。

USE AdventureWorks
GO

DECLARE @MyCursor CURSOR
SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM Sales.SalesPerson

DEALLOCATE @MyCursor

SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM Sales.SalesTerritory
GO

カーソル変数は、明示的に割り当てを解除する必要はありません。変数は、有効範囲を失うと暗黙的に割り当てが解除されます。

権限

DEALLOCATE 権限は、既定では、有効なユーザーであればどのユーザーにも与えられます。

次の例では、最後の名前まで、またはカーソルを参照している変数の割り当てが解除されるまで、カーソルが保持されます。

USE AdventureWorks
GO
-- Create and open a global named cursor that
-- is visible outside the batch.
DECLARE abc CURSOR GLOBAL SCROLL FOR
SELECT * FROM Sales.SalesPerson
OPEN abc
GO
-- Reference the named cursor with a cursor variable.
DECLARE @MyCrsrRef1 CURSOR
SET @MyCrsrRef1 = abc
-- Now deallocate the cursor reference.
DEALLOCATE @MyCrsrRef1
-- Cursor abc still exists.
FETCH NEXT FROM abc
GO
-- Reference the named cursor again.
DECLARE @MyCrsrRef2 CURSOR
SET @MyCrsrRef2 = abc
-- Now deallocate cursor name abc.
DEALLOCATE abc
-- Cursor still exists, referenced by @MyCrsrRef2.
FETCH NEXT FROM @MyCrsrRef2
-- Cursor finally is deallocated when last referencing
-- variable goes out of scope at the end of the batch.
GO
-- Create an unnamed cursor.
DECLARE @MyCursor CURSOR
SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM Sales.SalesTerritory
-- The following statement deallocates the cursor
-- because no other variables reference it.
DEALLOCATE @MyCursor
GO