次の方法で共有


DEALLOCATE (Transact-SQL)

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance

カーソル参照を削除します。 最後のカーソル参照の割り当てが解除されると、カーソルを構成するデータ構造は、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_namecursor 型である必要があります。

注釈

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

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

DECLARE abc SCROLL CURSOR FOR  
SELECT * FROM Person.Person;  

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

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

  • カーソルをカーソル変数に設定する 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 AdventureWorks2022;  
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 AdventureWorks2022;  
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)