WHILE (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в базе данных Microsoft Fabric SQL в Microsoft Fabric
Задает условие для повторяющегося выполнения инструкции ИЛИ блока инструкций SQL. Эти инструкции вызываются в цикле, пока указанное условие истинно. Выполнение инструкций в WHILE
цикле можно контролировать внутри цикла с помощью BREAK
ключевых слов и CONTINUE
ключевых слов.
Соглашения о синтаксисе Transact-SQL
Синтаксис
Синтаксис для SQL Server, База данных SQL Azure, Управляемый экземпляр SQL Azure и Microsoft Fabric.
WHILE boolean_expression
{ sql_statement | statement_block | BREAK | CONTINUE }
Синтаксис для Системы платформы Azure Synapse Analytics и Analytics (PDW).
WHILE boolean_expression
{ sql_statement | statement_block | BREAK }
Аргументы
boolean_expression
Выражение, возвращающее TRUE
или FALSE
. Если логическое выражение содержит SELECT
инструкцию, SELECT
оператор должен быть заключен в скобки.
{ sql_statement | statement_block }
Любая инструкция Transact-SQL или группирование инструкций в соответствии с блоком инструкций. Чтобы определить блок инструкций, используйте ключевые слова BEGIN
управления потоком и END
.
BREAK
Вызывает выход из самого WHILE
внутреннего цикла. Выполняются все операторы, которые отображаются после END
ключевого слова, помечая конец цикла.
Продолжить
WHILE
Перезапуск цикла. Все операторы после ключевого CONTINUE
слова игнорируются. CONTINUE
часто, но не всегда, открывается тестом IF
. Дополнительные сведения см. в разделе "Управление потоком".
Замечания
Если вложены два или более WHILE
циклов, внутренний BREAK
выход из следующего внешнего цикла. Все инструкции после окончания внутреннего цикла выполняются в первую очередь, а затем перезапускается следующий внешний цикл.
Примеры
Примеры кода Transact-SQL в этой статье используют AdventureWorks2022
базу данных или AdventureWorksDW2022
пример базы данных, которую можно скачать с домашней страницы примеров и проектов сообщества Microsoft SQL Server.
А. Использование BREAK и CONTINUE с вложенным IF... ELSE и WHILE
В следующем примере, если средняя цена по списку продукта меньше $ 300, WHILE
цикл удваивает цены, а затем выбирает максимальную цену. Если максимальная цена меньше или равна $500, WHILE
цикл перезапускается и снова увеличивает цены. Этот цикл продолжает удвоение цен до тех пор, пока максимальная цена не превышает $ 500, а затем выходит WHILE
из цикла и выводит сообщение.
USE AdventureWorks2022;
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. Использование WHILE в курсоре
В следующем примере используется переменная @@FETCH_STATUS
для управления действиями курсора в цикле WHILE
.
DECLARE @EmployeeID AS NVARCHAR(256)
DECLARE @Title AS NVARCHAR(50)
DECLARE Employee_Cursor CURSOR
FOR
SELECT LoginID,
JobTitle
FROM AdventureWorks2022.HumanResources.Employee
WHERE JobTitle = 'Marketing Specialist';
OPEN Employee_Cursor;
FETCH NEXT
FROM Employee_Cursor
INTO @EmployeeID,
@Title;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT ' ' + @EmployeeID + ' ' + @Title
FETCH NEXT
FROM Employee_Cursor
INTO @EmployeeID,
@Title;
END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
GO
Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)
C: цикл WHILE
В следующем примере, если средняя цена по списку продукта меньше $ 300, WHILE
цикл удваивает цены, а затем выбирает максимальную цену. Если максимальная цена меньше или равна $500, WHILE
цикл перезапускается и снова увеличивает цены. Этот цикл продолжает удвоение цен до тех пор, пока максимальная цена не превышает $ 500, а затем выходит из WHILE
цикла.
WHILE (
SELECT AVG(ListPrice)
FROM dbo.DimProduct
) < $300
BEGIN
UPDATE dbo.DimProduct
SET ListPrice = ListPrice * 2;
SELECT MAX(ListPrice)
FROM dbo.DimProduct
IF (
SELECT MAX(ListPrice)
FROM dbo.DimProduct
) > $500
BREAK;
END