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 MicrosoftSQL Server.
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 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.Contact
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.Contact
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 AdventureWorks
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
Questo script illustra come i cursori sono persistenti fino alla deallocazione dell'ultimo nome o dell'ultima variabile in cui vi viene fatto riferimento.
USE AdventureWorks
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
Vedere anche