Sdílet prostřednictvím


DEALLOCATE (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Odebere odkaz kurzoru. Při uvolnění posledního odkazu kurzoru jsou datové struktury, které tvoří kurzor, uvolněny microsoft SQL Serverem.

Transact-SQL konvence syntaxe

Syntax

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

Arguments

cursor_name
Je název již deklarovaného kurzoru. Pokud jako název existuje globální i místní kurzor s cursor_name , cursor_name odkazuje na globální kurzor, pokud GLOBAL je zadán, a na místní kurzor, pokud GLOBAL není zadán.

@ cursor_variable_name
Je název proměnné kurzoru . @ cursor_variable_name musí být kurzor typu.

Remarks

Příkazy, které pracují s kurzory, používají buď název kurzoru, nebo proměnnou kurzoru k odkazování na kurzor. DEALLOCATE odebere přidružení mezi kurzorem a názvem kurzoru nebo proměnnou kurzoru. Pokud je název nebo proměnná poslední odkazující na kurzor, kurzor se uvolní a uvolní se všechny prostředky používané kurzorem. Posuvné zámky používané k ochraně izolace načítání jsou uvolněny na DEALLOCATE. Zámky transakcí používané k ochraně aktualizací, včetně umístěných aktualizací provedených kurzorem, se uchovávají až do konce transakce.

Příkaz DECLARE CURSOR přidělí a přidruží kurzor k názvu kurzoru.

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

Po přidružení názvu kurzoru k kurzoru nelze tento název použít pro jiný kurzor stejného oboru (globální nebo místní), dokud nebude tento kurzor uvolněn.

Proměnná kurzoru je přidružená k kurzoru pomocí jedné ze dvou metod:

  • Pomocí názvu pomocí SET příkazu, který nastaví kurzor na proměnnou kurzoru.

    DECLARE @MyCrsrRef CURSOR;  
    SET @MyCrsrRef = abc;  
    
  • Kurzor lze také vytvořit a přidružit k proměnné, aniž by byl definován název kurzoru.

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

Příkaz DEALLOCATE <@cursor_variable_name> odebere pouze odkaz pojmenované proměnné na kurzor. Proměnná není uvolněna, dokud nepřejde mimo rozsah na konci dávky, uložené procedury nebo triggeru. DEALLOCATE <@cursor_variable_name> Po příkazu může být proměnná přidružena k jinému kurzoru pomocí příkazu 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  

Proměnná kurzoru nemusí být explicitně uvolněna. Proměnná je implicitně uvolněna, když přejde mimo rozsah.

Permissions

Oprávnění pro výchozí nastavení DEALLOCATE pro libovolného platného uživatele

Examples

Následující skript ukazuje, jak kurzory potrvají až do posledního jména nebo do doby, než je proměnná odkazující na ně uvolněna.

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  

Viz také

ZAVŘÍT (Transact-SQL)
Cursors
DECLARE @local_variable (Transact-SQL)
APORTUJ (Transact-SQL)
OTEVŘÍT (Transact-SQL)