SintaxeSyntax

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

ArgumentosArguments

cursor_namecursor_nameÉ o nome de um cursor já declarado.Is the name of an already declared cursor.Se houver um cursor global e um cursor local com cursor_name como seus nomes, o cursor_name se referirá ao cursor global se GLOBAL for especificado e ao cursor local se GLOBAL não for especificado.If both a global and a local cursor exist with cursor_name as their name, cursor_name refers to the global cursor if GLOBAL is specified and to the local cursor if GLOBAL is not specified.

@cursor_variable_name@cursor_variable_nameÉ o nome de uma variável de cursor.Is the name of a cursor variable. @cursor_variable_name precisa ser do tipo cursor. @cursor_variable_name must be of type cursor.

RemarksRemarks

As instruções que operam em cursores usam um nome de cursor ou uma variável de cursor para se referir ao cursor.Statements that operate on cursors use either a cursor name or a cursor variable to refer to the cursor.DEALLOCATE remove a associação entre um cursor e o nome de cursor ou variável de cursor.DEALLOCATE removes the association between a cursor and the cursor name or cursor variable.Se um nome ou uma variável forem os últimos a referenciarem o cursor, ele será desalocado e qualquer recurso usado por ele será liberado.If a name or variable is the last one referencing the cursor, the cursor is deallocated and any resources used by the cursor are freed.Os bloqueios de rolagem usados para proteger o isolamento de buscas são liberados em DEALLOCATE.Scroll locks used to protect the isolation of fetches are freed at DEALLOCATE.Os bloqueios de transação usados para proteger atualizações, incluindo atualizações posicionadas feitas através do cursor, são mantidos até o fim da transação.Transaction locks used to protect updates, including positioned updates made through the cursor, are held until the end of the transaction.

Depois que um nome de cursor é associado a um cursor, o nome não pode ser usado para outro cursor do mesmo escopo (global ou local) até que este tenha sido desalocado.After a cursor name is associated with a cursor, the name cannot be used for another cursor of the same scope (global or local) until this cursor has been deallocated.

Uma variável de cursor é associada a um cursor usando um destes dois métodos:A cursor variable is associated with a cursor using one of two methods:

Pelo nome usando uma instrução SET que define um cursor como uma variável de cursor.By name using a SET statement that sets a cursor to a cursor variable.

DECLARE @MyCrsrRef CURSOR;
SET @MyCrsrRef = abc;

Um cursor também pode ser criado e associado a uma variável sem ter um nome de cursor definido.A cursor can also be created and associated with a variable without having a cursor name defined.

Uma instrução DEALLOCATE <@cursor_variable_name> remove somente a referência da variável nomeada ao cursor.A DEALLOCATE <@cursor_variable_name> statement removes only the reference of the named variable to the cursor.A variável não é desalocada até que saia do escopo no fim do lote, procedimento armazenado ou gatilho.The variable is not deallocated until it goes out of scope at the end of the batch, stored procedure, or trigger.Depois de uma instrução DEALLOCATE <@cursor_variable_name>, a variável pode ser associada a outro cursor usando a instrução SET.After a DEALLOCATE <@cursor_variable_name> statement, the variable can be associated with another cursor using the SET statement.

Uma variável de cursor não precisa ser desalocada explicitamente.A cursor variable does not have to be explicitly deallocated.A variável é implicitamente desalocada quando sai de escopo.The variable is implicitly deallocated when it goes out of scope.

PermissõesPermissions

ExemplosExamples

O script a seguir mostra como os cursores persistem até o último nome ou até a variável que os referenciam ser desalocada.The following script shows how cursors persist until the last name or until the variable referencing them has been deallocated.

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