WHILE (Transact-SQL)
Legt eine Bedingung für die wiederholte Ausführung einer SQL-Anweisung oder eines Anweisungsblockes fest. Die Anweisungen werden wiederholt ausgeführt, solange die angegebene Bedingung true ist. Sie können die Ausführung der Anweisungen in der WHILE-Schleife mithilfe der Schlüsselwörter BREAK und CONTINUE auch innerhalb der Schleife steuern.
Syntax
WHILE Boolean_expression
{ sql_statement | statement_block | BREAK | CONTINUE }
Argumente
Boolean_expression
Ist ein Ausdruck, der TRUE oder FALSE zurückgibt. Enthält der boolesche Ausdruck eine SELECT-Anweisung, muss die SELECT-Anweisung in Klammern stehen.{sql_statement | statement_block}
Ist eine beliebige Transact-SQL-Anweisung oder -Anweisungsgruppe, die als Anweisungsblock definiert wurde. Um einen Anweisungsblock zu definieren, verwenden Sie die Schlüsselwörter zur Ablaufsteuerung BEGIN und END.BREAK
Bewirkt das Beenden der innersten WHILE-Schleife. Alle Anweisungen nach dem END-Schlüsselwort, das das Ende der Schleife markiert, werden ausgeführt.CONTINUE
Bewirkt, dass die WHILE-Schleife neu gestartet wird und alle Anweisungen nach dem CONTINUE-Schlüsselwort ignoriert werden.
Hinweise
Wenn zwei oder mehr WHILE-Schleifen geschachtelt sind, wird mit der inneren BREAK-Anweisung zur nächsten äußersten Schleife gesprungen. Alle Anweisungen nach dem Ende der inneren Schleife werden zuerst ausgeführt, und dann wird die nächste äußerste Schleife neu gestartet.
Beispiele
A. Verwenden von BREAK und CONTINUE mit geschachtelten IF...ELSE- und WHILE-Anweisungen
Im folgenden Beispiel verdoppelt die WHILE-Schleife die Preise und wählt dann den Höchstpreis aus, wenn der durchschnittliche Listenpreis eines Produkts unter $300 liegt. Ist der Höchstpreis niedriger als oder gleich $500, wird die WHILE-Schleife erneut gestartet und der Preis erneut verdoppelt. Diese Schleife verdoppelt die Preise so lange, bis der Höchstpreis mehr als $500 beträgt; dann wird die WHILE-Schleife beendet und eine Meldung ausgegeben.
USE AdventureWorks;
GO
WHILE (SELECT AVG(ListPrice) FROM Production.Product) < $300
BEGIN
UPDATE Production.Product
SET ListPrice = ListPrice * 2
SELECT MAX(ListPrice) FROM Production.Product
IF (SELECT MAX(ListPrice) FROM Production.Product) > $500
BREAK
ELSE
CONTINUE
END
PRINT 'Too much for the market to bear';
B. Verwenden von WHILE in einem Cursor
Im folgenden Beispiel wird @@FETCH_STATUS zur Steuerung der Cursoraktivitäten in einer WHILE-Schleife verwendet.
DECLARE Employee_Cursor CURSOR FOR
SELECT EmployeeID, Title
FROM AdventureWorks.HumanResources.Employee
WHERE ManagerID =3;
OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM Employee_Cursor;
END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
GO