DEALLOCATE DEALLOCATE - 北京怡康軟件科技有限公司 資源網(wǎng) "/>
刪除游標(biāo)引用。當(dāng)釋放最后的游標(biāo)引用時,組成該游標(biāo)的數(shù)據(jù)結(jié)構(gòu)由 Microsoft® SQL Server™ 釋放。
DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }
cursor_name
是已聲明游標(biāo)的名稱。當(dāng)全局和局部游標(biāo)都以 cursor_name 作為它們的名稱存在時,如果指定 GLOBAL,則 cursor_name 引用全局游標(biāo),如果未指定 GLOBAL,則 cursor_name 引用局部游標(biāo)。
@cursor_variable_name
是 cursor 變量的名稱。@cursor_variable_name 必須為 cursor 類型。
對游標(biāo)進(jìn)行操作的語句使用游標(biāo)名稱或游標(biāo)變量引用游標(biāo)。DEALLOCATE 刪除游標(biāo)與游標(biāo)名稱或游標(biāo)變量之間的關(guān)聯(lián)。如果一個名稱或變量是最后引用游標(biāo)的名稱或變量,則將釋放游標(biāo),游標(biāo)使用的任何資源也隨之釋放。用于保護(hù)提取隔離的滾動鎖在 DEALLOCATE 上釋放。用于保護(hù)更新(包括通過游標(biāo)進(jìn)行的定位更新)的事務(wù)鎖一直到事務(wù)結(jié)束才釋放。
DECLARE CURSOR 語句分配游標(biāo)并使其與游標(biāo)名稱關(guān)聯(lián):
DECLARE abc SCROLL CURSOR FOR
SELECT * FROM authors
游標(biāo)名稱與某個游標(biāo)關(guān)聯(lián)之后,該游標(biāo)在釋放之前不能用作相同作用域(GLOBAL 或 LOCAL)內(nèi)另一個游標(biāo)的名稱。
游標(biāo)變量使用下列兩種方法之一與游標(biāo)關(guān)聯(lián):
DECLARE @MyCrsrRef CURSOR
SET @MyCrsrRef = abc
DECLARE @MyCursor CURSOR
SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM titles
DEALLOCATE @cursor_variable_name 語句只刪除對游標(biāo)命名變量的引用。直到批處理、存儲過程或觸發(fā)器結(jié)束時變量離開作用域,才釋放變量。在 DEALLOCATE @cursor_variable_name 語句之后,可以使用 SET 語句使變量與另一個游標(biāo)關(guān)聯(lián)。
USE pubs
GO
DECLARE @MyCursor CURSOR
SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM titles
DEALLOCATE @MyCursor
SET @MyCursor = CURSOR LOCAL SCROLL FOR
SELECT * FROM sales
GO
不必顯式釋放游標(biāo)變量。變量在離開作用域時被隱性釋放。
默認(rèn)情況下,將 DEALLOCATE 權(quán)限授予任何有效用戶。
下面的腳本顯示游標(biāo)如何持續(xù)到最后的名稱或持續(xù)到引用它們的變量已釋放。
USE pubs相關(guān)文章
GO
-- Create and open a global named cursor that
-- is visible outside the batch.
DECLARE abc CURSOR GLOBAL SCROLL FOR
SELECT * FROM authors
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 titles
-- The following statement deallocates the cursor
-- because no other variables reference it.
DEALLOCATE @MyCursor
GO