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.

HinweisHinweis

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

Das folgende Beispiel steuert mithilfe einer WHILE-Anweisung, wie viele Abrufvorgänge durchgeführt werden.

USE AdventureWorks2008R2;
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.Person 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 AdventureWorks2008R2;
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';