Gibt es eine Methode zum Implementieren der do while
-Schleife in SQL Server 2008?
Ich bin nicht sicher über DO-WHILE in MS SQL Server 2008, aber Sie können Ihre WHILE-Schleifenlogik ändern, um sie wie eine DO-WHILE-Schleife zu verwenden.
Beispiele finden Sie hier: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of-while-loop-with-continue-und-break-keywords/
Beispiel für eine WHILE-Schleife
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 END GO
Ergebnissatz:
1 2 3 4 5
Beispiel für eine WHILE-Schleife mit dem Schlüsselwort BREAK
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 IF @intFlag = 4 BREAK; END GO
Ergebnissatz:
1 2 3
Beispiel für eine WHILE-Schleife mit den Schlüsselwörtern CONTINUE und BREAK
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
Ergebnissatz:
1 2 3 4 5
Versuchen Sie jedoch vermeiden Sie Schleifen auf Datenbankebene . Referenz .
Wenn Sie mit dem Schlüsselwort GOTO
nicht sehr beleidigt sind, können Sie es verwenden, um eine DO
/WHILE
in T-SQL zu simulieren. Betrachten Sie das folgende ziemlich unsinnige Beispiel im Pseudocode:
SET I=1
DO
PRINT I
SET I=I+1
WHILE I<=10
Hier ist der äquivalente T-SQL-Code, der goto verwendet:
DECLARE @I INT=1;
START: -- DO
PRINT @I;
SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10
Beachten Sie die Eins-zu-Eins-Zuordnung zwischen der GOTO
-aktivierten Lösung und dem ursprünglichen DO
/WHILE
-Pseudocode. Eine ähnliche Implementierung mit einer WHILE
-Schleife würde folgendermaßen aussehen:
DECLARE @I INT=1;
WHILE (1=1) -- DO
BEGIN
PRINT @I;
SET @I+=1;
IF NOT (@I<=10) BREAK; -- WHILE @I<=10
END
Jetzt können Sie dieses spezielle Beispiel natürlich als einfache WHILE
-Schleife umschreiben, da dies kein guter Kandidat für ein DO
/WHILE
-Konstrukt ist. Der Schwerpunkt lag auf der Kürze der Beispiele und nicht auf der Anwendbarkeit, da legitime Fälle, die eine DO
/WHILE
erfordern, selten sind.
REPEAT/UNTIL jedermann (funktioniert NICHT in T-SQL)?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
... und die GOTO
-basierte Lösung in T-SQL:
DECLARE @I INT=1;
START: -- REPEAT
PRINT @I;
SET @I+=1;
IF NOT(@I>10) GOTO START; -- UNTIL @I>10
Durch die kreative Verwendung von GOTO
und der Logikinversion über das Schlüsselwort NOT
besteht eine sehr enge Beziehung zwischen dem ursprünglichen Pseudocode und der auf GOTO
basierenden Lösung. Eine ähnliche Lösung mit einer WHILE
-Schleife sieht folgendermaßen aus:
DECLARE @I INT=1;
WHILE (1=1) -- REPEAT
BEGIN
PRINT @I;
SET @I+=1;
IF @I>10 BREAK; -- UNTIL @I>10
END
Es kann argumentiert werden, dass für den Fall der REPEAT
/UNTIL
die auf WHILE
basierende Lösung einfacher ist, da die if-Bedingung nicht invertiert ist. Andererseits ist es auch ausführlicher.
Wenn die Verwendung von GOTO
nicht für alle missbilligend wäre, könnten dies sogar idiomatische Lösungen für die wenigen Fälle sein, in denen diese (schlechten) Schleifenkonstrukte aus Gründen der Klarheit in T-SQL-Code erforderlich sind.
Verwenden Sie diese nach Ihrem eigenen Ermessen und versuchen Sie, den Zorn Ihrer Entwickler nicht zu erdulden, wenn sie Sie mit der viel bösartigen GOTO
erwischen.
Ich scheine mich zu erinnern, diesen Artikel mehr als einmal gelesen zu haben, und die Antwort ist nur nah was ich brauche.
Normalerweise, wenn ich denke, dass ich einen DO WHILE
in T-SQL brauche, liegt das daran, dass ich einen Cursor durchläuft und größtenteils nach optimaler Klarheit (vs. optimaler Geschwindigkeit) suche. In T-SQL scheint dies auf einen WHILE TRUE
/IF BREAK
zu passen.
Wenn dies das Szenario ist, das Sie hierher gebracht hat, kann Ihnen dieser Ausschnitt einen Moment sparen. Ansonsten willkommen zurück, ich. Jetzt kann ich sicher sein, dass ich schon mehr als einmal hier war. :)
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
Leider scheint T-SQL keine sauberere Methode zu bieten, um die Schleifenoperation eindeutig zu definieren, als diese Endlosschleife.
Sie können auch eine Exit-Variable verwenden, wenn Ihr Code etwas lesbarer sein soll:
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
Dies ist wahrscheinlich relevanter, wenn Sie eine kompliziertere Schleife haben und versuchen, die Logik zu verfolgen. Wie gesagt, Schleifen sind teuer, probieren Sie andere Methoden aus, wenn Sie können.
Only While Loop wird offiziell vom SQL Server unterstützt. Es gibt bereits answer für DO while-Schleife. Ich erkläre Antworten auf Möglichkeiten, verschiedene Arten von Schleifen in SQL Server zu erreichen.
Wenn Sie wissen, dass Sie die erste Wiederholung der Schleife trotzdem abschließen müssen, können Sie die Version DO..WHILE oder REPEAT..UNTIL des SQL-Servers ausprobieren.
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';