DEALLOCATE (Transact-SQL)

删除游标引用。当释放最后的游标引用时,组成该游标的数据结构由 Microsoft SQL Server 释放。

主题链接图标Transact-SQL 语法约定

语法

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

参数

  • cursor_name
    已声明游标的名称。如果全局游标和局部游标都使用 cursor_name 作为它们的名称,那么指定 GLOBAL 时,cursor_name 指的是全局游标;未指定 GLOBAL 时,则指的是局部游标。

  • @cursor_variable_name
    cursor 变量的名称。@cursor_variable_name 的数据类型必须为 cursor。

注释

对游标进行操作的语句使用游标名称或游标变量引用游标。DEALLOCATE 删除游标与游标名称或游标变量之间的关联。如果一个名称或变量是最后引用游标的名称或变量,则将释放游标,游标使用的任何资源也随之释放。用于保护提取隔离的滚动锁在 DEALLOCATE 上释放。用于保护更新(包括通过游标进行的定位更新)的事务锁一直到事务结束才释放。

DECLARE CURSOR 语句分配游标并将其与游标名称关联。

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

游标名称与某个游标关联之后,该名称在游标释放之前不能用作相同作用域(GLOBAL 或 LOCAL)内另一个游标的名称。

游标变量使用下列两种方法之一与游标关联:

  • 通过名称,使用 SET 语句将游标设置为游标变量。

    DECLARE @MyCrsrRef CURSOR
    SET @MyCrsrRef = abc
    
  • 也可以不定义游标名称而创建游标并将其与变量关联。

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

DEALLOCATE @cursor_variable_name 语句只删除对游标名称变量的引用。直到批处理、存储过程或触发器结束时变量离开作用域,才释放变量。在 DEALLOCATE @cursor_variable_name 语句之后,可以使用 SET 语句将变量与另一个游标关联。

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

不必显式释放游标变量。变量在离开作用域时被隐式释放。

权限

默认情况下,将 DEALLOCATE 权限授予任何有效用户。

示例

以下脚本显示游标如何持续到最后的名称或持续到引用它们的变量已释放。

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