Поделиться через


Использование инструкций WHILE...BREAK или CONTINUE

Инструкция WHILE повторяет инструкцию или блок инструкций до тех пор, пока указанное условие выполняется.

Обычно с инструкцией WHILE используются следующие две инструкции языка Transact-SQL: BREAK или CONTINUE. Инструкция BREAK выходит из самого внутреннего цикла WHILE, а инструкция CONTINUE заново начинает цикл WHILE. Программа может выполнить инструкцию BREAK в случае, если, например, больше нет строк для обработки. Инструкцию CONTINUE можно выполнять в том случае, если, например, выполнение кода следует продолжить.

ПримечаниеПримечание

Если инструкция SELECT используется в качестве условия для инструкции WHILE, то инструкцию SELECT следует заключить в скобки.

Примеры

А. Применение инструкции WHILE в курсоре

Следующий пример использует инструкцию WHILE для управления количеством произведенных выборок:

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

Ниже приведены другие возможные проверки условия WHILE:

WHILE (@ACounterVariable < 100)

или

WHILE EXISTS(SELECT LastName FROM Person.Person WHERE FirstName = N'Anne')

Б. Использование ключевых слов BREAK и CONTINUE внутри вложенных конструкций IF...ELSE и WHILE

В следующем примере в случае, если средняя цена продуктов из списка меньше чем $300, цикл WHILE удваивает цены, а затем выбирает максимальную. В том случае, если максимальная цена меньше или равна $500, цикл WHILE повторяется и снова удваивает цены. Этот цикл продолжает удваивать цены до тех пор, пока максимальная цена не будет больше чем $500, затем выполнение цикла WHILE прекращается, о чем выводится соответствующее сообщение.

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';