Bagikan melalui


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.

Konvensi sintaks transact-SQL

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)