Birçok programlama dilinde kullanılan WHILE döngüsü, belirli kod bloklarını koşula bağlı olarak tekrar tekrar çalıştırmaya yarar.
SQL Server’da While’in çeşitli formları olan do..while, for..loop gibi kalıplar kullanılmamaktadır. Sadece While kullanılır.
While bir koşula bağlanmazsa döngü sonsuz devam eder. Bu yüzden genellikle sayac kurguları ile döngünün sınırlanması sağlanır.
While döngüsünün genel yapısı aşağıdaki gibidir. İlk önce koşul kontrol edilir. Daha sonra koşula uyduğu taktirde istenen işlemler yapılır(update,delete,select , insert vs.). BEGIN END aralığına birden çok işlem eklenebilir.
WHILE kosul
BEGIN
islemler END
1-Aşağıdaki örnekte @sayac isimli bir değişken oluşturuldu.
2-Default değer=1 olarak atandı.
3-While döngüsüne 3ten küçük ya da eşit (@sayac <= 3) olduğu taktirde döngüye devam edilecek koşul eklendi.
4-PRINT ile her bir döngüde elde edilen sayac değerinin gösterilmesi sağlandı.
5-@sayac değişkeninin (değişmesi)artması için @sayac = @sayac + 1 olarak setlendi.
DECLARE @sayac INT = 1 WHILE ( @sayac <= 3) BEGIN PRINT @sayac SET @sayac = @sayac + 1 END ÇIKTI 1 2 3
İşleyiş:
İlk default değere bakılır. 3ten küçükse döngüye girer. Döngü içinde print ile yazdırılır ve @sayac = @sayac + 1 ifadesinden olayı @sayac=2 olur.
Tekrar while koşuluna gelir. 3ten küçükse tekrar işlem gerçekleşir. Print 2 yazar. 3 değeri atanır. En son 3 için de aynı işlemler tekrarlanır. Son atanan 4 değeri koşulu karşılamadığı için döngüden çıkar.
DECLARE @sayi INT DECLARE @limit INT; SET @sayi = 1 SET @limit = 2; WHILE @sayi< 10 BEGIN SELECT * FROM products --tablo için norhwind veritabanı kullanılmıştır ORDER BY ProductID OFFSET @sayi ROWS FETCH NEXT @limit ROWS ONLY SET @sayi = @sayi + 5; END
1-@sayı ve @limit değişkenleri tanımlandı.
2- SET ile değişkenlere ilgili değerler atandı.
3-While döngü koşulu @sayi< 10 olarka belirlendi.
4-Eğer sayı 10dan küçükse, @sayi kadar satır kaydırarak (OFFSET @sayi ROWS)
Sadece @Limit kadar satır getirerek
SELECT * FROM products ORDER BY ProductID sorgusunu çalıştır.
5-@sayı değerini 5 arttır. Döngünün başına dön.
ÇIKTI:
CONTINUE
Continue ifadesi While döngüsü içinde kullanıldığında döngünün başına geri dönmeyi sağlar.
DECLARE @sayı INT; DECLARE @mod INT; SET @sayı = 1; WHILE @sayı<= 6 BEGIN set @mod = @sayı % 2 IF @mod = 1 BEGIN SET @sayı = @sayı + 1; CONTINUE END PRINT @sayı SET @sayı = @sayı + 1; END; ÇIKTI: 2 4 6
1-@sayı ve @mod isimli değişkenler tanımlandı.
2-@sayı değişkenine default olarak 1 değeri atandı.
3-döngü koşulu girildi. (@sayı<= 6) eğer @sayı değeri 6dan küçük ya da eşitse döngüye girecek ve birkaç işlem uygulanacak
4- set @mod = @sayı % 2 yazılarak @mod değişkenine değer atandı. (@sayı değerinin 2ye bölümünden kalan)
5-Kontrol yapabilmek için IF eklendi. Eğer @mod=1 ise @sayı değerini 1 arttır(SET @sayı = @sayı + 1;) ve while ifadesinin başına dön(dönmeyi sağlayan CONTINUE ifadesidir).
6-Eğer @mod=1 değilse IF koşulundan çıkar ve (PRINT @sayı) ile ilgili değeri yazdırır. Son olarak SET @sayı = @sayı + 1 ifadesi ile sayıyı 1 arttırır ve While Döngüsünün başına döner.
BREAK
Break ifadesi While döngüsü içinde kullanıldığında döngüden çıkabilmeyi sağlar.
Yukarıdaki örnekte CONTINUE yerine BREAK yazılıp çalıştırıldığında herhangi bir çıktı vermeyecektir. Çünkü, 2.adımda atanan default değeri (1) kullanarak 4. Adımda @mod=1 bulacak ve 5.adımda IF koşulunu sağladığı için BREAK komutu ile döngüden çıkış yapacaktır.
Eğer default değer olarak 2 atanırsa, 6.adıma gelecek ve 2 değerini yazdıracaktır.
DECLARE @sayi INT; SET @sayi = 0; WHILE @sayi<= 15 BEGIN IF @sayi > 8 BEGIN BREAK END PRINT 'Sayı değeri: ' + CONVERT(NVARCHAR,@sayi) SET @sayi = @sayi + 3; END
1-@sayı değişkeni tanımlandı.
2-@sayı değişkenine default olarak 0 atandı.
3-while döngüsüne girebilme koşulu olarak @sayi<= 15 eklendi.
4-Eğer @sayı>8 ise döngüden çıkması sağlandı.
5-Eğer @sayı<8 ise PRINT ile sayının yazılması sağlandı. (metin ile birleştirildiği için @sayi değeri nvarchar olarak convert edildi.)
6-Son olarka tekrar başa dönmeden önce @sayı değerinin +3 olarka artması sağlandı.
Aşağıdaki kaynaklardan ilham alınmıştır:
https://www.sqlshack.com/sql-while-loop-understanding-while-loops-in-sql-server/
https://www.sqlshack.com/sql-while-loop-with-simple-examples/