Gibt es eine Methode zum Implementieren einer do while
Schleife in SQL Server 2008?
Gibt es eine Methode zum Implementieren einer do while
Schleife in SQL Server 2008?
Antworten:
Ich bin mir bei DO-WHILE in MS SQL Server 2008 nicht sicher, aber Sie können Ihre WHILE-Schleifenlogik ändern, um sie wie die 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-and-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
ResultSet:
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
ResultSet:
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
ResultSet:
1 2 3 4 5
Aber versuchen, Schleifen zu vermeiden auf Datenbankebene. Referenz .
Wenn Sie mit dem GOTO
Schlüsselwort nicht sehr beleidigt sind , können Sie damit ein DO
/ WHILE
in T-SQL simulieren . Betrachten Sie das folgende eher unsinnige Beispiel, das in Pseudocode geschrieben ist:
SET I=1
DO
PRINT I
SET I=I+1
WHILE I<=10
Hier ist der äquivalente T-SQL-Code mit goto:
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 Original 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 Beispiel natürlich als einfache WHILE
Schleife umschreiben , da dies kein so guter Kandidat für ein DO
/ WHILE
-Konstrukt ist. Der Schwerpunkt lag eher auf der Kürze des Beispiels als auf der Anwendbarkeit, da legitime Fälle, die ein DO
/ erfordern, WHILE
selten sind.
REPEAT / UNTIL, jemand (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 GOTO
und logische Inversion über das NOT
Schlüsselwort besteht eine sehr enge Beziehung zwischen dem ursprünglichen Pseudocode und der GOTO
basierten 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 von REPEAT
/ UNTIL
die WHILE
basierte Lösung einfacher ist, da die if-Bedingung nicht invertiert wird. Andererseits ist es auch ausführlicher.
Wenn nicht all die Verachtung in Bezug auf die Verwendung von wäre GOTO
, könnten dies sogar idiomatische Lösungen für die wenigen Male sein, in denen diese speziellen (bösen) Schleifenkonstrukte aus Gründen der Klarheit im T-SQL-Code erforderlich sind.
Verwenden Sie diese nach eigenem Ermessen und versuchen Sie, nicht den Zorn Ihrer Entwicklerkollegen zu erleiden, wenn sie Sie mit den vielfach bösartigen Personen erwischen GOTO
.
Ich erinnere mich an das mehrmalige Lesen dieses Artikels, und die Antwort kommt nur dem nahe , was ich brauche.
Wenn ich denke, dass ich einen DO WHILE
in T-SQL benötige, liegt das normalerweise daran, dass ich einen Cursor iteriere und hauptsächlich nach optimaler Klarheit (im Vergleich zu optimaler Geschwindigkeit) suche. In T-SQL scheint das zu einem WHILE TRUE
/ zu passen IF BREAK
.
Wenn dies das Szenario ist, das Sie hierher gebracht hat, kann dieses Snippet Ihnen einen Moment ersparen. Ansonsten willkommen zurück, ich. Jetzt kann ich sicher sein, dass ich 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 Möglichkeit zu bieten, die Schleifenoperation einzeln zu definieren, als diese Endlosschleife.
Sie können auch eine Exit-Variable verwenden, wenn Ihr Code besser lesbar 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 wäre wahrscheinlich relevanter, wenn Sie eine kompliziertere Schleife haben und versuchen, die Logik im Auge zu behalten. Wie bereits erwähnt, sind Schleifen teuer. Versuchen Sie daher, andere Methoden zu verwenden, wenn Sie können.
Nur While Loop wird offiziell vom SQL Server unterstützt. Es gibt bereits eine Antwort für DO while-Schleife. Ich erläutere die Antwort auf Möglichkeiten, um verschiedene Arten von Schleifen in SQL Server zu erreichen.
Wenn Sie wissen, dass Sie die erste Iteration der Schleife trotzdem abschließen müssen, können Sie die Version DO..WHILE oder REPEAT..UNTIL von SQL Server 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';