Partager via


DEALLOCATE (Transact-SQL)

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

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

Syntaxe

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

Arguments

  • cursor_name
    Nom d'un curseur déjà déclaré. Si un curseur global et un curseur local ont tous les deux le même nom cursor_name, cursor_name fait référence au curseur global si GLOBAL est précisé, et au curseur local dans le cas contraire.

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

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.Contact

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.Contact
    

Une instruction DEALLOCATE @cursor_variable_name supprime uniquement la référence de la variable au curseur. La variable est désallouée uniquement lorsqu'elle est hors de portée à la fin d'un traitement d'instructions, 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 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

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.

Exemple

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é désalloués.

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