DEALLOCATE (Transact-SQL)
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance
Menghapus referensi kursor. Ketika referensi kursor terakhir dibatalkan alokasinya, struktur data yang terdiri dari kursor dirilis oleh Microsoft SQL Server.
Sintaks
DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }
Argumen
cursor_name
Adalah nama kursor yang sudah dideklarasikan. Jika kursor global dan lokal ada dengan cursor_name sebagai nama mereka, cursor_name mengacu pada kursor global jika GLOBAL
ditentukan dan ke kursor lokal jika GLOBAL
tidak ditentukan.
@cursor_variable_name
Adalah nama variabel kursor . @ cursor_variable_name harus berjenis kursor.
Keterangan
Pernyataan yang beroperasi pada kursor menggunakan nama kursor atau variabel kursor untuk merujuk ke kursor. DEALLOCATE
menghapus kaitan antara kursor dan nama kursor atau variabel kursor. Jika nama atau variabel adalah yang terakhir yang merujuk kursor, kursor dibatalkan alokasinya dan sumber daya apa pun yang digunakan oleh kursor dibeberkan. Kunci gulir yang digunakan untuk melindungi isolasi pengambilan dibeberkan di DEALLOCATE
. Kunci transaksi yang digunakan untuk melindungi pembaruan, termasuk pembaruan yang diposisikan yang dibuat melalui kursor, ditahan hingga akhir transaksi.
Pernyataan mengalokasikan DECLARE CURSOR
dan mengaitkan kursor dengan nama kursor.
DECLARE abc SCROLL CURSOR FOR
SELECT * FROM Person.Person;
Setelah nama kursor dikaitkan dengan kursor, nama tidak dapat digunakan untuk kursor lain dari cakupan yang sama (global atau lokal) hingga kursor ini dibatalkan alokasinya.
Variabel kursor dikaitkan dengan kursor menggunakan salah satu dari dua metode:
Berdasarkan nama menggunakan
SET
pernyataan yang mengatur kursor ke variabel kursor.DECLARE @MyCrsrRef CURSOR; SET @MyCrsrRef = abc;
Kursor juga dapat dibuat dan dikaitkan dengan variabel tanpa memiliki nama kursor yang ditentukan.
DECLARE @MyCursor CURSOR; SET @MyCursor = CURSOR LOCAL SCROLL FOR SELECT * FROM Person.Person;
Pernyataan DEALLOCATE <@cursor_variable_name>
hanya menghapus referensi variabel bernama ke kursor. Variabel tidak dibatalkan alokasinya sampai keluar dari cakupan di akhir batch, prosedur tersimpan, atau pemicu. DEALLOCATE <@cursor_variable_name>
Setelah pernyataan, variabel dapat dikaitkan dengan kursor lain menggunakan pernyataan 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
Variabel kursor tidak harus dibatalkan alokasinya secara eksplisit. Variabel secara implisit dibatalkan alokasinya ketika keluar dari cakupan.
Izin
Izin untuk DEALLOCATE
default ke pengguna yang valid.
Contoh
Skrip berikut menunjukkan bagaimana kursor bertahan hingga nama belakang atau sampai variabel yang merujuknya telah dibatalkan alokasinya.
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
Lihat Juga
TUTUP (T-SQL)
Kursor
DECLARE @local_variable (Transact-SQL)
FETCH (Transact-SQL)
BUKA (Transact-SQL)