DEALLOCATE (Transact-SQL)
Quita una referencia a un cursor. Cuando se ha quitado la última referencia al cursor, MicrosoftSQL Server libera las estructuras de datos que componen el cursor.
Sintaxis
DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }
Argumentos
cursor_name
Es el nombre de un cursor ya declarado. Si existen un cursor global y otro local denominados cursor_name, cursor_name hace referencia al cursor global si se especifica GLOBAL y al cursor local si no se especifica GLOBAL.@cursor_variable_name
Es el nombre de una variable cursor. @cursor_variable_name debe ser de tipo cursor.
Notas
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 recuperaciones 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.Contact
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.Contact
La instrucción DEALLOCATE @cursor_variable_name quita sólo la referencia de la variable mencionada al cursor. No se cancela la asignación de 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 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
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
Este script muestra cómo los cursores se mantienen hasta que se ha cancelado la asignación del último nombre o variable que hace referencia a ellos.
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
Vea también