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.
Convenciones 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;
Una instrucción DEALLOCATE @cursor\_variable\_name solo quita la referencia de la variable con nombre al cursor. 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 AdventureWorks2012;
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 AdventureWorks2012;
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
Vea también
Referencia
DECLARE @local\_variable (Transact-SQL)