Delen via


DEALLOCATE (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric Preview

Hiermee verwijdert u een verwijzing naar de cursor. Wanneer de laatste verwijzing naar de cursor ongedaan wordt gemaakt, worden de gegevensstructuren die de cursor omvatten, vrijgegeven door Microsoft SQL Server.

Transact-SQL syntaxis-conventies

Syntax

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

Arguments

cursor_name
Is de naam van een al gedeclareerde cursor. Als zowel een globale als een lokale cursor met cursor_name als naam bestaat, verwijst cursor_name naar de globale cursor als GLOBAL deze is opgegeven en naar de lokale cursor als GLOBAL deze niet is opgegeven.

@ cursor_variable_name
Is de naam van een cursorvariabele . @ cursor_variable_name moet van het type cursor zijn.

Remarks

Instructies die op cursors worden uitgevoerd, gebruiken een cursornaam of een cursorvariabele om naar de cursor te verwijzen. DEALLOCATE verwijdert de koppeling tussen een cursor en de cursornaam of cursorvariabele. Als een naam of variabele de laatste is die verwijst naar de cursor, wordt de toewijzing van de cursor opgeheven en worden alle resources die door de cursor worden gebruikt, vrijgemaakt. Schuifvergrendelingen die worden gebruikt om de isolatie van ophalen te beschermen, worden vrijgemaakt bij DEALLOCATE. Transactievergrendelingen die worden gebruikt voor het beveiligen van updates, inclusief geplaatste updates die via de cursor zijn gemaakt, worden bewaard tot het einde van de transactie.

Met de DECLARE CURSOR instructie wordt een cursor aan een cursornaam toegewezen en gekoppeld.

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

Nadat een cursornaam is gekoppeld aan een cursor, kan de naam niet worden gebruikt voor een andere cursor van hetzelfde bereik (globaal of lokaal) totdat de toewijzing van deze cursor ongedaan is gemaakt.

Een cursorvariabele is gekoppeld aan een cursor met behulp van een van de volgende twee methoden:

  • Met de naam van een SET instructie waarmee een cursor wordt ingesteld op een cursorvariabele.

    DECLARE @MyCrsrRef CURSOR;  
    SET @MyCrsrRef = abc;  
    
  • Een cursor kan ook worden gemaakt en gekoppeld aan een variabele zonder dat er een cursornaam is gedefinieerd.

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

Met een DEALLOCATE <@cursor_variable_name> instructie wordt alleen de verwijzing van de benoemde variabele naar de cursor verwijderd. De variabele wordt pas weer toegewezen als deze buiten het bereik valt aan het einde van de batch, opgeslagen procedure of trigger. Na een DEALLOCATE <@cursor_variable_name> instructie kan de variabele worden gekoppeld aan een andere cursor met behulp van de SET-instructie.

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  

De toewijzing van een cursorvariabele hoeft niet expliciet ongedaan te worden gemaakt. De variabele wordt impliciet de toewijzing opgeheven wanneer deze buiten het bereik valt.

Permissions

Standaardmachtigingen voor DEALLOCATE elke geldige gebruiker.

Examples

In het volgende script ziet u hoe cursors behouden blijven tot de achternaam of totdat de variabele waarnaar wordt verwezen, de toewijzing ervan ongedaan is gemaakt.

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)