Gunakan variabel tabel atau tabel sementara.
Seperti yang telah disebutkan sebelumnya, kursor adalah pilihan terakhir. Sebagian besar karena menggunakan banyak sumber daya, masalah mengunci dan mungkin menjadi tanda Anda tidak mengerti cara menggunakan SQL dengan benar.
Catatan: Saya pernah menemukan solusi yang menggunakan kursor untuk memperbarui baris dalam sebuah tabel. Setelah beberapa penelitian, ternyata semuanya bisa diganti dengan satu perintah UPDATE. Namun, dalam kasus ini, di mana prosedur tersimpan harus dijalankan, satu perintah SQL tidak akan berfungsi.
Buat variabel tabel seperti ini (jika Anda bekerja dengan banyak data atau kekurangan memori, gunakan tabel sementara sebagai gantinya):
DECLARE @menus AS TABLE (
id INT IDENTITY(1,1),
parent NVARCHAR(128),
child NVARCHAR(128));
Itu id
penting.
Ganti parent
dan child
dengan beberapa data yang baik, misalnya pengidentifikasi yang relevan atau seluruh rangkaian data yang akan dioperasikan.
Masukkan data dalam tabel, misalnya:
INSERT INTO @menus (parent, child)
VALUES ('Some name', 'Child name');
...
INSERT INTO @menus (parent,child)
VALUES ('Some other name', 'Some other child name');
Nyatakan beberapa variabel:
DECLARE @id INT = 1;
DECLARE @parentName NVARCHAR(128);
DECLARE @childName NVARCHAR(128);
Dan akhirnya, buat loop sementara di atas data dalam tabel:
WHILE @id IS NOT NULL
BEGIN
SELECT @parentName = parent,
@childName = child
FROM @menus WHERE id = @id;
EXEC myProcedure @parent=@parentName, @child=@childName;
SELECT @id = MIN(id) FROM @menus WHERE id > @id;
END
Pilih pertama mengambil data dari tabel sementara. Pilihan kedua memperbarui @id. MIN
mengembalikan nol jika tidak ada baris yang dipilih.
Pendekatan alternatif adalah untuk mengulang sementara tabel memiliki baris, SELECT TOP 1
dan menghapus baris yang dipilih dari tabel temp:
WHILE EXISTS(SELECT 1 FROM @menuIDs)
BEGIN
SELECT TOP 1 @menuID = menuID FROM @menuIDs;
EXEC myProcedure @menuID=@menuID;
DELETE FROM @menuIDs WHERE menuID = @menuID;
END;