DEALLOCATE (Transact-SQL)DEALLOCATE (Transact-SQL)

APLICA-SE A: simSQL Server (a partir do 2008) simBanco de Dados SQL do Azure nãoSQL Data Warehouse do Azure nãoParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Remove uma referência de cursor.Removes a cursor reference. Quando a última referência de cursor é desalocada, as estruturas de dados que compõem o cursor são liberadas pelo MicrosoftMicrosoft SQL ServerSQL Server.When the last cursor reference is deallocated, the data structures comprising the cursor are released by MicrosoftMicrosoft SQL ServerSQL Server.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

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.

A instrução DECLARE CURSOR aloca e associa um cursor a um nome de cursor.The DECLARE CURSOR statement allocates and associates a cursor with a cursor name.

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

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.

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

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.

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  

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

As permissões para DEALLOCATE são padronizadas para qualquer usuário válido.Permissions for DEALLOCATE default to any valid user.

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  

Consulte TambémSee Also

CLOSE (Transact-SQL) CLOSE (Transact-SQL)
Cursores Cursors
DECLARE @local_variable (Transact-SQL) DECLARE @local_variable (Transact-SQL)
FETCH (Transact-SQL) FETCH (Transact-SQL)
OPEN (Transact-SQL)OPEN (Transact-SQL)