Partilhar via


DESALOCAR (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Remove uma referência de cursor. Quando a última referência de cursor é deslocalizada, as estruturas de dados que compõem o cursor são liberadas pelo Microsoft SQL Server.

Transact-SQL convenções de sintaxe

Syntax

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

Arguments

cursor_name
É o nome de um cursor já declarado. Se existirem um cursor global e um cursor local com cursor_name como nome, cursor_name refere-se ao cursor global se GLOBAL for especificado e ao cursor local se GLOBAL não for especificado.

@ cursor_variable_name
É o nome de uma variável de cursor . @ cursor_variable_name deve ser do tipo cursor.

Remarks

As instruções que operam em cursores usam um nome de cursor ou uma variável de cursor para se referir ao cursor. DEALLOCATE Remove a associação entre um cursor e o nome do cursor ou a variável do cursor. Se um nome ou variável for o último que faz referência ao cursor, o cursor é desalocado e todos os recursos usados pelo cursor são liberados. Os bloqueios de rolagem usados para proteger o isolamento de buscas são liberados em 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 final da transação.

A DECLARE CURSOR instrução aloca e associa um cursor a um nome de cursor.

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 esse cursor tenha sido deslocalizado.

Uma variável de cursor é associada a um cursor usando um de dois métodos:

  • Por nome usando uma SET instrução que define um cursor para uma variável de cursor.

    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.

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

Uma DEALLOCATE <@cursor_variable_name> instrução remove apenas a referência da variável nomeada ao cursor. A variável não é desalocada até sair do escopo no final do lote, procedimento armazenado ou gatilho. Após uma DEALLOCATE <@cursor_variable_name> instrução, a variável pode ser associada a outro cursor usando a instrução SET.

USE AdventureWorks2022;  
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 explicitamente deslocalizada. A variável é implicitamente desalocada quando sai do escopo.

Permissions

Permissões padrão DEALLOCATE para qualquer usuário válido.

Examples

O script a seguir mostra como os cursores persistem até que o sobrenome ou até que a variável que os referencia tenha sido deslocalizada.

USE AdventureWorks2022;  
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  

Ver também

FECHAR (Transact-SQL)
Cursors
DECLARE @local_variable (Transact-SQL)
BUSCAR (Transact-SQL)
ABERTO (Transact-SQL)