Verwenden von WHILE...BREAK oder CONTINUE
Die WHILE-Anweisung wiederholt eine Anweisung oder einen Block von Anweisungen, so lange eine bestimmte Bedingung erfüllt ist.
In Verbindung mit BREAK oder CONTINUE werden in der Regel zwei Transact-SQL-Anweisungen verwendet: Die BREAK-Anweisung beendet die innerste WHILE-Schleife, während die CONTINUE-Anweisung eine WHILE-Schleife neu startet. Ein Programm kann eine BREAK-Anweisung ausführen, wenn z. B. keine weiteren Zeilen zu verarbeiten sind. Eine CONTINUE-Anweisung kann ausgeführt werden, wenn z. B. die Ausführung des Codes fortgesetzt werden soll.
Hinweis |
---|
Falls eine SELECT-Anweisung als Bedingung für die WHILE-Anweisung verwendet wird, muss die SELECT-Anweisung in Klammern eingeschlossen werden. |
Beispiele
A. Verwenden von WHILE in einem Cursor
Im folgenden Beispiel wird mithilfe einer WHILE-Anweisung gesteuert, wie viele Abrufvorgänge durchgeführt werden.
USE AdventureWorks;
GO
DECLARE abc CURSOR FOR
SELECT * FROM Purchasing.ShipMethod;
OPEN abc;
FETCH NEXT FROM abc
WHILE (@@FETCH_STATUS = 0)
FETCH NEXT FROM abc;
CLOSE abc;
DEALLOCATE abc;
GO
Weitere gültige Tests für die WHILE-Bedingung sind z. B. die folgenden:
WHILE (@ACounterVariable < 100)
Oder
WHILE EXISTS(SELECT LastName FROM Person.Contact WHERE FirstName = N'Anne')
B. 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';