DEALLOCATE (Transact-SQL)

Quita una referencia a un cursor. Cuando se ha desasignado la última referencia al cursor, Microsoft SQL Server libera las estructuras de datos que componen el cursor.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

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

Argumentos

  • cursor_name
    Es el nombre de un cursor ya declarado. Si hay un cursor global y otro local con el nombre cursor_name, cursor_name hace referencia al cursor global si se especifica GLOBAL y, si no se especifica GLOBAL, hace referencia al cursor local.

  • @cursor_variable_name
    Es el nombre de una variable cursor. @cursor_variable_name debe ser de tipo cursor.

Comentarios

Las instrucciones que realizan operaciones sobre cursores utilizan un nombre de cursor o una variable de cursor para hacer referencia al cursor. DEALLOCATE quita la asociación existente entre un cursor y el nombre del cursor o la variable de cursor. Si un nombre o variable es el último que hace referencia a un cursor, se quita el cursor y se liberan los recursos que utiliza. Los bloqueos de desplazamiento utilizados para proteger el aislamiento de las capturas se liberan en DEALLOCATE. Los bloqueos de transacciones utilizados para proteger las actualizaciones, incluidas las actualizaciones posicionadas creadas a través del cursor, se mantienen hasta el final de la transacción.

La instrucción DECLARE CURSOR asigna y asocia un cursor a un nombre de cursor.

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

Después de asociar un nombre de cursor a un cursor, ningún otro cursor del mismo ámbito (GLOBAL o LOCAL) puede utilizar el nombre hasta que se haya cancelado la asignación al cursor.

Una variable de cursor se puede asociar a un cursor mediante uno de estos dos métodos:

  • Por nombre con una instrucción SET que asocia un cursor a una variable de cursor.

    DECLARE @MyCrsrRef CURSOR
    SET @MyCrsrRef = abc
    
  • También se puede crear y asociar un cursor a una variable sin necesidad de definir un nombre de cursor.

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

La instrucción DEALLOCATE @cursor_variable_name solo quita al cursor la referencia de la variable mencionada. No se desasigna la variable hasta que sale de ámbito al final del proceso por lotes, procedimiento almacenado o desencadenador. Después de una instrucción DEALLOCATE @cursor_variable_name, se puede asociar la variable a otro cursor mediante la instrucción 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

No es necesario cancelar explícitamente la asignación de una variable de cursor. La asignación de la variable se cancela implícitamente cuando sale de ámbito.

Permisos

Los permisos para utilizar DEALLOCATE pertenecen de manera predeterminada a cualquier usuario válido.

Ejemplos

El siguiente script muestra cómo los cursores se mantienen hasta que se ha desasignado el último nombre o variable que hace referencia a ellos.

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