do whileSQL Server 2008'de uygulama döngüsü için herhangi bir yöntem var mı ?
do whileSQL 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 GOSonuç kümesi:
1 2 3 4 5BREAK 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 GOSonuç kümesi:
1 2 3CONTINUE 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 GOSonuç kümesi:
1 2 3 4 5
Ancak veritabanı düzeyinde döngüleri önlemeye çalışın . Referans .
GOTOAnahtar kelimeden çok rahatsız değilseniz, bir T-SQL'de DO/ WHILEiç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
GOTOEtkinleştirilmiş çözüm ile orijinal DO/ WHILEsözde kod arasındaki bire bir eşleşmeye dikkat edin . WHILEDö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 WHILEdöngü olarak yeniden yazabilirsiniz , çünkü bu a DO/ WHILEconstruct için o kadar iyi bir aday değildir . Vurgu, uygulanabilirlikten ziyade örnek kısalığı üzerineydi, çünkü a DO/ gerektiren meşru davalar WHILEnadirdir.
TEKRARLA / KADAR, herkes (T-SQL'de ÇALIŞMAZ)?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
... ve GOTOT-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ı GOTOve mantıksal ters çevirme yoluyla NOT, orijinal sözde kod ile GOTOtemelli çözüm arasında çok yakın bir ilişki vardır . WHILEDö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, WHILEeğ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 WHILET-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';