DEALLOCATE (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure

Rimuove un riferimento a un cursore. Dopo che l'ultimo riferimento al cursore è stato deallocato, Microsoft SQL Server rilascia le strutture di dati che includono il cursore.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

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

Argomenti

cursor_name
Nome di un cursore già dichiarato. Se esistono sia un cursore globale che un cursore locale con il nome cursor_name, cursor_name indica il cursore globale se viene specificata la parola chiave GLOBAL e il cursore locale se la parola chiave GLOBAL viene omessa.

@cursor_variable_name
Nome di una variabile di cursore. @cursor_variable_name deve essere di tipo cursor.

Osservazioni:

Le istruzioni che hanno effetto sui cursori utilizzano un nome di cursore o una variabile di cursore per fare riferimento al cursore. L'istruzione DEALLOCATE elimina l'associazione tra un cursore e il nome di cursore o la variabile di cursore. Se il nome o la variabile è l'ultimo riferimento al cursore, il cursore viene deallocato e le risorse da esso utilizzate vengono rilasciate. I blocchi di scorrimento utilizzati per proteggere l'isolamento delle operazioni di recupero vengono rilasciati dall'istruzione DEALLOCATE. I blocchi a livello di transazione utilizzati per proteggere gli aggiornamenti, inclusi gli aggiornamenti posizionati eseguiti con il cursore, vengono mantenuti attivi fino al termine della transazione.

L'istruzione DECLARE CURSOR consente di allocare un cursore e di associarlo a un nome di cursore.

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

Il nome associato a un cursore potrà essere utilizzato per un altro cursore dello stesso ambito (globale o locale) solo dopo la deallocazione del primo cursore.

Una variabile di cursore può essere associata a un cursore in uno dei due modi seguenti:

  • È possibile specificarne il nome, utilizzando un'istruzione SET che associa un cursore a una variabile di cursore.

    DECLARE @MyCrsrRef CURSOR;  
    SET @MyCrsrRef = abc;  
    
  • È possibile creare un cursore e associarlo a una variabile senza utilizzare una precedente definizione di nome di cursore.

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

Un'istruzione DEALLOCATE <@cursor_variable_name> elimina solo il riferimento al cursore dalla variabile specificata. La variabile verrà deallocata solo quando non sarà più compresa nell'ambito al termine dell'esecuzione del batch, della stored procedure o del trigger. Dopo l'esecuzione di un'istruzione DEALLOCATE <@cursor_variable_name> è possibile associare la variabile a un altro cursore tramite l'istruzione 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  

Non è necessario deallocare una variabile di cursore in modo esplicito. La variabile viene deallocata in modo implicito quando non è più compresa nell'ambito.

Autorizzazioni

Le autorizzazioni per l'istruzione DEALLOCATE vengono assegnate per impostazione predefinita a qualsiasi utente valido.

Esempi

Nello script seguente viene illustrato come i cursori sono persistenti fino alla deallocazione dell'ultimo nome o dell'ultima variabile in cui vi viene fatto riferimento.

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  

Vedi anche

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