DEALLOCATE (Transact-SQL)

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

Icona di collegamento a un argomentoConvenzioni della 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 specificato in cursor_name, cursor_nameindica il cursore globale se viene specificato l'argomento GLOBAL. In caso contrario indica il cursore locale.

  • @cursor_variable_name
    Nome di una variabile cursor. @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 (GLOBAL o LOCAL) 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 AdventureWorks2008R2;
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 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 AdventureWorks2008R2;
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