Megosztás a következőn keresztül:


DEALLOCATE (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Eltávolít egy kurzorhivatkozást. Az utolsó kurzorhivatkozás felszabadításakor a Microsoft SQL Server felszabadítja a kurzort tartalmazó adatstruktúrákat.

Transact-SQL szintaxis konvenciók

Syntax

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

Arguments

cursor_name
Egy már deklarált kurzor neve. Ha mind a globális, mind a helyi kurzor cursor_name szerepel a nevükben,cursor_name a globális kurzorra hivatkozik, ha GLOBAL meg van adva, és ha GLOBAL nincs megadva, a helyi kurzorra.

@ cursor_variable_name
A kurzorváltozó neve. @ cursor_variable_namekurzor típusúnak kell lennie.

Remarks

A kurzorokon működő utasítások kurzornévvel vagy kurzorváltozóval hivatkoznak a kurzorra. DEALLOCATE eltávolítja a kurzor és a kurzor neve vagy a kurzor változója közötti társításokat. Ha egy név vagy változó az utolsó, amely a kurzorra hivatkozik, a kurzor felszabadítva lesz, és a kurzor által használt erőforrások felszabadulnak. A lekérések elkülönítésének védelmére használt görgetőzárak a következő helyen DEALLOCATEszabadulnak fel: . A frissítések védelmére szolgáló tranzakciózárak, beleértve a kurzoron keresztüli elhelyezésű frissítéseket is, a tranzakció végéig maradnak.

Az DECLARE CURSOR utasítás lefoglalja és társítja a kurzort egy kurzor nevével.

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

Miután a kurzornév hozzá lett rendelve egy kurzorhoz, a név nem használható egy másik, azonos hatókörű (globális vagy helyi) kurzorhoz, amíg el nem helyezi a kurzort.

A kurzorváltozó a kurzorhoz két módszer egyikével van társítva:

  • Név alapján egy SET olyan utasítással, amely a kurzort egy kurzorváltozóra állítja.

    DECLARE @MyCrsrRef CURSOR;  
    SET @MyCrsrRef = abc;  
    
  • A kurzort úgy is létrehozhatja és társíthatja egy változóhoz, hogy nincs definiálva a kurzor neve.

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

Az DEALLOCATE <@cursor_variable_name> utasítás csak az elnevezett változó kurzorra mutató hivatkozását távolítja el. A változó nem lesz felszabadítva, amíg ki nem lép a hatókörből a köteg, a tárolt eljárás vagy az eseményindító végén. Egy DEALLOCATE <@cursor_variable_name> utasítás után a változó a SET utasítással társítható egy másik kurzorhoz.

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  

A kurzorváltozót nem kell explicit módon felszabadítani. A változó implicit módon lesz felszabadítva, amikor kimegy a hatókörből.

Permissions

DEALLOCATE Az alapértelmezett engedélyek bármely érvényes felhasználóra vonatkozóan.

Examples

Az alábbi szkript bemutatja, hogyan maradnak a kurzorok a vezetéknévig vagy a hivatkozó változó felszabadításáig.

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  

Lásd még:

ZÁRT (Transact-SQL)
Cursors
DECLARE @local_variable (Transact-SQL)
HOZNI (Transact-SQL)
NYISD (Transact-SQL)