Udostępnij za pomocą


DEALLOCATE (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Usuwa odwołanie do kursora. Po cofnięciu przydziału ostatniego odwołania kursora struktury danych składające się z kursora są zwalniane przez program Microsoft SQL Server.

Transact-SQL konwencje składni

Syntax

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

Arguments

cursor_name
To nazwa już zadeklarowanego kursora. Jeśli zarówno globalny, jak i lokalny kursor istnieje z cursor_name jako ich nazwa, cursor_name odnosi się do kursora globalnego, jeśli GLOBAL jest określony i do kursora lokalnego, jeśli GLOBAL nie zostanie określony.

@ cursor_variable_name
To nazwa zmiennej kursora . @ cursor_variable_name musi być kursorem typu.

Remarks

Instrukcje działające na kursorach używają nazwy kursora lub zmiennej kursora, aby odwoływać się do kursora. DEALLOCATE usuwa skojarzenie między kursorem a nazwą kursora lub zmienną kursora. Jeśli nazwa lub zmienna jest ostatnim odwołującym się do kursora, kursor zostanie cofnięty, a wszystkie zasoby używane przez kursor zostaną zwolnione. Blokady przewijania używane do ochrony izolacji pobierania są zwalniane pod adresem DEALLOCATE. Blokady transakcji używane do ochrony aktualizacji, w tym aktualizacji umieszczonych za pośrednictwem kursora, są przechowywane do końca transakcji.

Instrukcja DECLARE CURSOR przydziela i kojarzy kursor z nazwą kursora.

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

Po skojarzeniu nazwy kursora z kursorem nie można użyć nazwy dla innego kursora tego samego zakresu (globalnego lub lokalnego), dopóki ten kursor nie zostanie cofnięty.

Zmienna kursora jest skojarzona z kursorem przy użyciu jednej z dwóch metod:

  • Przy użyciu instrukcji , SET która ustawia kursor na zmienną kursora.

    DECLARE @MyCrsrRef CURSOR;  
    SET @MyCrsrRef = abc;  
    
  • Kursor można również utworzyć i skojarzyć ze zmienną bez zdefiniowanej nazwy kursora.

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

Instrukcja DEALLOCATE <@cursor_variable_name> usuwa tylko odwołanie do nazwanej zmiennej do kursora. Zmienna nie zostanie cofnięto przydziału, dopóki nie przekroczy zakresu na końcu partii, procedury składowanej lub wyzwalacza. Po instrukcji zmienna DEALLOCATE <@cursor_variable_name> może być skojarzona z innym kursorem przy użyciu instrukcji 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  

Zmienna kursora nie musi być jawnie cofnięto przydziału. Zmienna jest niejawnie cofnięto przydział, gdy wykracza poza zakres.

Permissions

Uprawnienia domyślne dla DEALLOCATE dowolnego prawidłowego użytkownika.

Examples

Poniższy skrypt pokazuje, jak kursory są utrwalane do momentu, gdy nazwisko lub do momentu cofnięcia przydziału zmiennej odwołującej się do nich.

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  

Zobacz też

ZAMKNIJ (Transact-SQL)
Cursors
DECLARE @local_variable (Transact-SQL)
PRZYNIEŚ (Transact-SQL)
OTWÓRZ (Transact-SQL)