Dela via


DEALLOCATE (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Förhandsversion av Microsoft Fabric

Tar bort en markörreferens. När den sista markörens referens frigörs släpps datastrukturerna som består av markören av Microsoft SQL Server.

Transact-SQL syntaxkonventioner

Syntax

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

Arguments

cursor_name
Är namnet på en redan deklarerad markör. Om både en global och en lokal markör finns med cursor_name som namn refererar cursor_name till den globala markören om GLOBAL den har angetts och till den lokala markören om GLOBAL den inte har angetts.

@ cursor_variable_name
Är namnet på en markörvariabel . @ cursor_variable_name måste vara av typen markör.

Remarks

Instruktioner som används på markörer använder antingen ett markörnamn eller en markörvariabel för att referera till markören. DEALLOCATE tar bort associationen mellan en markör och markörens namn eller markörvariabel. Om ett namn eller en variabel är den sista som refererar till markören frigörs markören och alla resurser som används av markören frigörs. Rullningslås som används för att skydda isoleringen av hämtningar frigörs på DEALLOCATE. Transaktionslås som används för att skydda uppdateringar, inklusive placerade uppdateringar som görs via markören, hålls kvar till slutet av transaktionen.

Instruktionen DECLARE CURSOR allokerar och associerar en markör med ett markörnamn.

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

När ett markörnamn har associerats med en markör kan namnet inte användas för en annan markör med samma omfång (globalt eller lokalt) förrän markören har frigjorts.

En markörvariabel associeras med en markör med någon av två metoder:

  • Efter namn med hjälp av en SET instruktion som anger en markör till en markörvariabel.

    DECLARE @MyCrsrRef CURSOR;  
    SET @MyCrsrRef = abc;  
    
  • En markör kan också skapas och associeras med en variabel utan att ett markörnamn har definierats.

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

En DEALLOCATE <@cursor_variable_name> instruktion tar bara bort referensen för den namngivna variabeln till markören. Variabeln frigörs inte förrän den hamnar utanför omfånget i slutet av batchen, den lagrade proceduren eller utlösaren. Efter en DEALLOCATE <@cursor_variable_name> instruktion kan variabeln associeras med en annan markör med hjälp av SET-instruktionen.

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  

En markörvariabel behöver inte uttryckligen frigöras. Variabeln frigörs implicit när den hamnar utanför omfånget.

Permissions

Behörigheter för DEALLOCATE standard för alla giltiga användare.

Examples

Följande skript visar hur markörer bevaras tills efternamnet eller tills variabeln som refererar till dem har frigjorts.

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  

See Also

CLOSE (Transact-SQL)
Cursors
DECLARE @local_variable (Transact-SQL)
FETCH (Transact-SQL)
OPEN (Transact-SQL)