DEALLOCATE (Transact-SQL)

Supprime une référence de curseur. Une fois la dernière référence de curseur désallouée, Microsoft SQL Server libère les structures de données contenant le curseur.

Icône Lien de rubriqueConventions de syntaxe de Transact-SQL

Syntaxe

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

Arguments

  • cursor_name
    Nom d'un curseur déjà déclaré. S'il existe deux curseurs, un global et un local, nommés cursor_name, la variable cursor_name fait référence au curseur global si GLOBAL est spécifié et au curseur local si GLOBAL n'est pas spécifié.

  • @cursor_variable_name
    Nom d'une variable cursor. @cursor_variable_name doit être de type cursor.

Notes

Les instructions affectant les curseurs font référence à ceux-ci à l'aide d'un nom ou d'une variable de curseur. DEALLOCATE supprime l'association entre un curseur et le nom ou la variable de curseur. S'il s'agit du dernier nom ou de la dernière variable qui référence le curseur, ce dernier est désalloué et les ressources qu'il utilisait sont libérées. DEALLOCATE libère les verrous de défilement qui protègent l'isolation d'extractions. Les verrous de transaction, utilisés pour protéger les mises à jour, notamment les mises à jour pointées par le curseur, sont maintenus jusqu'à la fin de la transaction.

L'instruction DECLARE CURSOR alloue et associe un curseur à un nom de curseur.

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

Dès qu'un nom de curseur est associé à un curseur, vous ne pouvez pas lui affecter un autre curseur de même portée (GLOBAL ou LOCAL) tant que ce curseur n'a pas été libéré.

Une variable de curseur est associée à un curseur à l'aide de l'une des deux méthodes suivantes :

  • en spécifiant son nom à l'aide d'une instruction SET qui affecte un curseur à une variable de curseur ;

    DECLARE @MyCrsrRef CURSOR
    SET @MyCrsrRef = abc
    
  • en créant et en associant un curseur à une variable sans qu'il y ait de nom de curseur défini.

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

Une instruction DEALLOCATE @cursor_variable_name supprime uniquement la référence de la variable nommée au curseur. La variable est libérée uniquement lorsqu'elle est hors de portée à la fin d'un lot, d'une procédure stockée ou d'un déclencheur. Après une instruction DEALLOCATE @cursor_variable_name, la variable peut être associée à un autre curseur à l'aide d'une instruction 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

Il n'est pas nécessaire de désallouer explicitement une variable de curseur. Elle est implicitement désallouée une fois qu'elle est hors de portée.

Autorisations

Par défaut, tout utilisateur valide a l'autorisation d'utiliser l'instruction DEALLOCATE.

Exemples

Le script suivant montre comment les curseurs sont maintenus jusqu'à ce que le dernier nom ou la variable les référençant aient été libérés.

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