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

Gilt für: JaSQL Server JaAzure SQL-Datenbank NeinAzure Synapse Analytics (SQL DW) NeinParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Entfernt einen Cursorverweis.Removes a cursor reference. Nachdem die Zuordnung des letzten Cursorverweises aufgehoben wurde, werden alle Datenstrukturen, die den Cursor bilden, von MicrosoftMicrosoft SQL ServerSQL Server freigegeben.When the last cursor reference is deallocated, the data structures comprising the cursor are released by MicrosoftMicrosoft SQL ServerSQL Server.

Themenlinksymbol Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

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

ArgumenteArguments

cursor_namecursor_name
Der Name eines bereits deklarierten Cursors.Is the name of an already declared cursor. Falls sowohl ein lokaler als auch ein globaler Cursor namens cursor_name vorhanden ist, bezieht sich cursor_name nur dann auf den globalen Cursor, wenn GLOBAL angegeben ist. Wird GLOBAL nicht angegeben, bezieht es sich auf den lokalen Cursor.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
Der Name einer cursor-Variablen.Is the name of a cursor variable. @cursor_variable_name muss vom Typ cursor sein. @cursor_variable_name must be of type cursor.

BemerkungenRemarks

Anweisungen, die auf Cursor angewendet werden, verwenden entweder einen Cursornamen oder eine Cursorvariable, um auf den Cursor zu verweisen.Statements that operate on cursors use either a cursor name or a cursor variable to refer to the cursor. DEALLOCATE entfernt die Zuordnung zwischen einem Cursor und dem Cursornamen oder der Cursorvariablen.DEALLOCATE removes the association between a cursor and the cursor name or cursor variable. Ist dies der letzte Name bzw. die letzte Variable, die auf den Cursor verweist, wird die Zuordnung des Cursors aufgehoben, und alle vom Cursor verwendeten Ressourcen werden freigegeben.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. Durch DEALLOCATE werden alle Scrollsperren freigegeben, die zum Schützen der Isolierung der Abrufvorgänge verwendet werden.Scroll locks used to protect the isolation of fetches are freed at DEALLOCATE. Transaktionssperren, mit denen vom Cursor vorgenommene Updates, einschließlich positionierter Updates, geschützt werden, bleiben bis zum Ende der Transaktion wirksam.Transaction locks used to protect updates, including positioned updates made through the cursor, are held until the end of the transaction.

Die DECLARE CURSOR-Anweisung ordnet einem Cursor einen Cursornamen zu.The DECLARE CURSOR statement allocates and associates a cursor with a cursor name.

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

Nachdem dem Cursor ein Cursorname zugeordnet wurde, kann der Name so lange nicht für einen anderen Cursor des gleichen Bereiches (global oder lokal) verwendet werden, bis die Zuordnung des Cursors aufgehoben wurde.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.

Eine Cursorvariable kann mithilfe einer der beiden folgenden Methoden einem Cursor zugeordnet werden:A cursor variable is associated with a cursor using one of two methods:

  • Über den Namen mithilfe einer SET-Anweisung, in der ein Cursor auf eine Cursorvariable festgelegt wird.By name using a SET statement that sets a cursor to a cursor variable.

    DECLARE @MyCrsrRef CURSOR;  
    SET @MyCrsrRef = abc;  
    
  • Ein Cursor kann auch erstellt und einer Variablen zugeordnet werden, ohne dass ein Cursorname definiert ist.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;  
    

Eine DEALLOCATE <@cursor_variable_name>-Anweisung entfernt nur den Verweis der benannten Variablen auf den Cursor.A DEALLOCATE <@cursor_variable_name> statement removes only the reference of the named variable to the cursor. Die Zuordnung der Variablen wird erst dann aufgehoben, wenn sie am Ende des Batches, der gespeicherten Prozedur oder des Triggers den Gültigkeitsbereich verlässt.The variable is not deallocated until it goes out of scope at the end of the batch, stored procedure, or trigger. Nach einer DEALLOCATE <@cursor_variable_name>-Anweisung kann die Variable mithilfe einer SET-Anweisung einem anderen Cursor zugeordnet werden.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  

Eine Zuordnung für eine Cursorvariable muss nicht explizit aufgehoben werden.A cursor variable does not have to be explicitly deallocated. Die Zuordnung der Variablen wird implizit aufgehoben, wenn sie den Bereich verlässt.The variable is implicitly deallocated when it goes out of scope.

BerechtigungenPermissions

DEALLOCATE-Berechtigungen erhalten standardmäßig alle gültigen Benutzer.Permissions for DEALLOCATE default to any valid user.

BeispieleExamples

Im folgenden Skript wird gezeigt, wie Cursor erhalten bleiben, bis die Zuordnung des letzten Namens oder der Variablen, die auf die Cursor verweist, aufgehoben wurde.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  

Weitere InformationenSee Also

CLOSE (Transact-SQL) CLOSE (Transact-SQL)
Cursor Cursors
DEKLARIEREN SIE @local_variable (Transact-SQL) DECLARE @local_variable (Transact-SQL)
FETCH (Transact-SQL) FETCH (Transact-SQL)
OPEN (Transact-SQL)OPEN (Transact-SQL)