do while
SQL Server 2008'de uygulama döngüsü için herhangi bir yöntem var mı ?
do while
SQL Server 2008'de uygulama döngüsü için herhangi bir yöntem var mı ?
Yanıtlar:
MS SQL Server 2008'DEKİ DO-WHILE'den emin değilim, ancak WHILE döngü mantığınızı DO-WHILE döngüsü gibi KULLANACAK şekilde değiştirebilirsiniz.
Örnekler buradan alınmıştır: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of- while-loop-with-continue-and-break-keywords/
WHILE Döngüsü Örneği
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 END GO
Sonuç kümesi:
1 2 3 4 5
BREAK anahtar kelimeli WHILE Döngüsü örneği
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 IF @intFlag = 4 BREAK; END GO
Sonuç kümesi:
1 2 3
CONTINUE ve BREAK anahtar kelimelerine sahip WHILE Loop örneği
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 CONTINUE; IF @intFlag = 4 -- This will never executed BREAK; END GO
Sonuç kümesi:
1 2 3 4 5
Ancak veritabanı düzeyinde döngüleri önlemeye çalışın . Referans .
GOTO
Anahtar kelimeden çok rahatsız değilseniz, bir T-SQL'de DO
/ WHILE
içinde simüle etmek için kullanılabilir . Sözde kodla yazılmış aşağıdaki oldukça saçma örneği düşünün:
SET I=1
DO
PRINT I
SET I=I+1
WHILE I<=10
Goto kullanan eşdeğer T-SQL kodu:
DECLARE @I INT=1;
START: -- DO
PRINT @I;
SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10
GOTO
Etkinleştirilmiş çözüm ile orijinal DO
/ WHILE
sözde kod arasındaki bire bir eşleşmeye dikkat edin . WHILE
Döngü kullanan benzer bir uygulama şöyle görünecektir:
DECLARE @I INT=1;
WHILE (1=1) -- DO
BEGIN
PRINT @I;
SET @I+=1;
IF NOT (@I<=10) BREAK; -- WHILE @I<=10
END
Şimdi, bu belirli örneği elbette basit bir WHILE
döngü olarak yeniden yazabilirsiniz , çünkü bu a DO
/ WHILE
construct için o kadar iyi bir aday değildir . Vurgu, uygulanabilirlikten ziyade örnek kısalığı üzerineydi, çünkü a DO
/ gerektiren meşru davalar WHILE
nadirdir.
TEKRARLA / KADAR, herkes (T-SQL'de ÇALIŞMAZ)?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
... ve GOTO
T-SQL'deki temel çözüm:
DECLARE @I INT=1;
START: -- REPEAT
PRINT @I;
SET @I+=1;
IF NOT(@I>10) GOTO START; -- UNTIL @I>10
Anahtar kelime aracılığıyla yaratıcı kullanımı GOTO
ve mantıksal ters çevirme yoluyla NOT
, orijinal sözde kod ile GOTO
temelli çözüm arasında çok yakın bir ilişki vardır . WHILE
Döngü kullanan benzer bir çözüm şuna benzer:
DECLARE @I INT=1;
WHILE (1=1) -- REPEAT
BEGIN
PRINT @I;
SET @I+=1;
IF @I>10 BREAK; -- UNTIL @I>10
END
Bir tartışma durumunda söz konusu yapılabilir REPEAT
/ UNTIL
, WHILE
eğer koşul ters olmadığından tabanlı bir çözümdür, daha basittir. Öte yandan, aynı zamanda daha ayrıntılıdır.
Kullanımıyla ilgili tüm küçümseme olmasaydı GOTO
, bu belirli (kötü) döngü yapılarının netlik uğruna T-SQL kodunda gerekli olduğu birkaç kez için deyimsel çözümler bile olabilir.
Bunları kendi takdirinize bağlı olarak kullanın ve sizi çok kötü olanı kullanırken yakaladıklarında diğer geliştiricilerinizin gazabına uğramamaya çalışın GOTO
.
Bu makaleyi bir kereden fazla okuduğumu hatırlıyorum ve cevap sadece ihtiyacım olana yakın .
Genellikle DO WHILE
T-SQL'de a'ya ihtiyacım olacağını düşündüğümde , bunun nedeni bir imleci yineliyor olmam ve büyük ölçüde optimum netlik (optimum hıza karşılık) arıyorum. T-SQL'de a WHILE TRUE
/ IF BREAK
.
Sizi buraya getiren senaryo buysa, bu pasaj size biraz zaman kazandırabilir. Aksi takdirde, tekrar hoş geldiniz, ben. Şimdi burada birden fazla olduğumdan emin olabilirim. :)
DECLARE Id INT, @Title VARCHAR(50)
DECLARE Iterator CURSOR FORWARD_ONLY FOR
SELECT Id, Title FROM dbo.SourceTable
OPEN Iterator
WHILE 1=1 BEGIN
FETCH NEXT FROM @InputTable INTO @Id, @Title
IF @@FETCH_STATUS < 0 BREAK
PRINT 'Do something with ' + @Title
END
CLOSE Iterator
DEALLOCATE Iterator
Ne yazık ki, T-SQL döngü işlemini tek başına tanımlamak için bu sonsuz döngüden daha temiz bir yol sunmuyor gibi görünüyor.
Kodunuzun biraz daha okunaklı olmasını istiyorsanız bir çıkış değişkeni de kullanabilirsiniz:
DECLARE @Flag int = 0
DECLARE @Done bit = 0
WHILE @Done = 0 BEGIN
SET @Flag = @Flag + 1
PRINT @Flag
IF @Flag >= 5 SET @Done = 1
END
Bu, daha karmaşık bir döngünüz olduğunda ve mantığı takip etmeye çalıştığınızda muhtemelen daha alakalı olacaktır. Belirtildiği gibi döngüler pahalıdır, bu yüzden mümkünse diğer yöntemleri deneyin ve kullanın.
Only While Loop resmi olarak SQL sunucusu tarafından desteklenmektedir. Zaten döngü sırasında DO'nun cevabı var . SQL sunucusunda farklı döngü türlerine ulaşmanın yolları hakkında ayrıntılı cevaplar veriyorum.
Biliyorsanız, yine de döngünün ilk yinelemesini tamamlamanız gerekir, o zaman SQL sunucusunun DO..WHILE veya REPEAT..UNTIL sürümünü deneyebilirsiniz .
DECLARE @X INT=1;
WAY: --> Here the DO statement
PRINT @X;
SET @X += 1;
IF @X<=10 GOTO WAY;
DECLARE @X INT = 1;
WAY: -- Here the REPEAT statement
PRINT @X;
SET @X += 1;
IFNOT(@X > 10) GOTO WAY;
DECLARE @cnt INT = 0;
WHILE @cnt < 10
BEGIN
PRINT 'Inside FOR LOOP';
SET @cnt = @cnt + 1;
END;
PRINT 'Done FOR LOOP';