qinbaby 2011-04-07
DEALLOCATE
删除游标引用。当释放最后的游标引用时,组成该游标的数据结构由Microsoft®SQLServer™释放。
语法
DEALLOCATE{{[GLOBAL]cursor_name}|@cursor_variable_name}
参数
cursor_name
是已声明游标的名称。当全局和局部游标都以cursor_name作为它们的名称存在时,如果指定GLOBAL,则cursor_name引用全局游标,如果未指定GLOBAL,则cursor_name引用局部游标。
@cursor_variable_name
是cursor变量的名称。@cursor_variable_name必须为cursor类型。
注释
对游标进行操作的语句使用游标名称或游标变量引用游标。DEALLOCATE删除游标与游标名称或游标变量之间的关联。如果一个名称或变量是最后引用游标的名称或变量,则将释放游标,游标使用的任何资源也随之释放。用于保护提取隔离的滚动锁在DEALLOCATE上释放。用于保护更新(包括通过游标进行的定位更新)的事务锁一直到事务结束才释放。
DECLARECURSOR语句分配游标并使其与游标名称关联:
DECLAREabcSCROLLCURSORFOR
SELECT*FROMauthors
游标名称与某个游标关联之后,该游标在释放之前不能用作相同作用域(GLOBAL或LOCAL)内另一个游标的名称。
游标变量使用下列两种方法之一与游标关联:
通过名称,使用SET语句将游标设置为游标变量:
DECLARE@MyCrsrRefCURSOR
SET@MyCrsrRef=abc
也可以不定义游标名称而创建游标并使其与变量关联:
DECLARE@MyCursorCURSOR
SET@MyCursor=CURSORLOCALSCROLLFOR
SELECT*FROMtitles
DEALLOCATE@cursor_variable_name语句只删除对游标命名变量的引用。直到批处理、存储过程或触发器结束时变量离开作用域,才释放变量。在DEALLOCATE@cursor_variable_name语句之后,可以使用SET语句使变量与另一个游标关联。
USEpubs
GO
DECLARE@MyCursorCURSOR
SET@MyCursor=CURSORLOCALSCROLLFOR
SELECT*FROMtitles
DEALLOCATE@MyCursor
SET@MyCursor=CURSORLOCALSCROLLFOR
SELECT*FROMsales
GO
不必显式释放游标变量。变量在离开作用域时被隐性释放。
权限
默认情况下,将DEALLOCATE权限授予任何有效用户。
示例
下面的脚本显示游标如何持续到最后的名称或持续到引用它们的变量已释放。
USEpubs
GO
--Createandopenaglobalnamedcursorthat
--isvisibleoutsidethebatch.
DECLAREabcCURSORGLOBALSCROLLFOR
SELECT*FROMauthors
OPENabc
GO
--Referencethenamedcursorwithacursorvariable.
DECLARE@MyCrsrRef1CURSOR
SET@MyCrsrRef1=abc
--Nowdeallocatethecursorreference.
DEALLOCATE@MyCrsrRef1
--Cursorabcstillexists.
FETCHNEXTFROMabc
GO
--Referencethenamedcursoragain.
DECLARE@MyCrsrRef2CURSOR
SET@MyCrsrRef2=abc
--Nowdeallocatecursornameabc.
DEALLOCATEabc
--Cursorstillexists,referencedby@MyCrsrRef2.
FETCHNEXTFROM@MyCrsrRef2
--Cursorfinallyisdeallocatedwhenlastreferencing
--variablegoesoutofscopeattheendofthebatch.
GO
--Createanunnamedcursor.
DECLARE@MyCursorCURSOR
SET@MyCursor=CURSORLOCALSCROLLFOR
SELECT*FROMtitles
--Thefollowingstatementdeallocatesthecursor
--becausenoothervariablesreferenceit.
DEALLOCATE@MyCursor
GO