DEALLOCATE (Transact-SQL)
カーソル参照を削除します。最後のカーソル参照の割り当てが解除されると、カーソルを構成するデータ構造は、Microsoft SQL Server によって解放されます。
構文
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
参照
関連項目
CLOSE (Transact-SQL)
DECLARE @local\_variable (Transact-SQL)
FETCH (Transact-SQL)
OPEN (Transact-SQL)