DEALLOCATE (Transact-SQL)

カーソル参照を削除します。最後のカーソル参照の割り当てが解除されると、カーソルを構成するデータ構造は、Microsoft SQL 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.Person;

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

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

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

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

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

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

USE AdventureWorks2008R2;
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 AdventureWorks2008R2;
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