Использование инструкций 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';