Bir tablo değişkeni veya geçici bir tablo kullanın.
Daha önce de belirtildiği gibi, bir imleç son çare. Çoğunlukla çok fazla kaynak, sorun kilidi kullandığından ve SQL'in nasıl düzgün kullanılacağını anlamadığınızı gösteren bir işaret olabileceğinden.
Yan not: Bir keresinde bir tablodaki satırları güncellemek için imleçleri kullanan bir çözümle karşılaştım. Bazı incelemelerden sonra, her şeyin tek bir UPDATE komutuyla değiştirilebileceği ortaya çıktı. Ancak, saklı yordamın yürütülmesi gereken bu durumda, tek bir SQL komutu çalışmaz.
Bunun gibi bir tablo değişkeni oluşturun (çok fazla veriyle çalışıyorsanız veya bellekte yetersizseniz, bunun yerine geçici bir tablo kullanın):
DECLARE @menus AS TABLE (
id INT IDENTITY(1,1),
parent NVARCHAR(128),
child NVARCHAR(128));
Bu id
önemlidir.
Değiştir parent
ve child
bazı iyi veriler, örneğin, ilgili tanıtıcı bilgiler ya da bütün veri kümesiyle birlikte ameliyat edilecek.
Tabloya veri ekleyin, örneğin:
INSERT INTO @menus (parent, child)
VALUES ('Some name', 'Child name');
...
INSERT INTO @menus (parent,child)
VALUES ('Some other name', 'Some other child name');
Bazı değişkenleri bildirin:
DECLARE @id INT = 1;
DECLARE @parentName NVARCHAR(128);
DECLARE @childName NVARCHAR(128);
Ve son olarak, tablodaki veriler üzerinde bir while döngüsü oluşturun:
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
İlk seçim geçici tablodan veri getirir. İkinci seçim @id değerini günceller. MIN
hiçbir satır seçilmemişse null değerini döndürür.
Alternatif bir yaklaşım, tabloda satırlar varken döngü oluşturmak SELECT TOP 1
ve seçilen satırı geçici tablodan kaldırmaktır:
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;