Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Applies to:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL analytics endpoint in Microsoft Fabric
Warehouse in Microsoft Fabric
SQL database in Microsoft Fabric
Задает условие для повторяющегося выполнения инструкции ИЛИ блока инструкций SQL. Эти инструкции вызываются в цикле, пока указанное условие истинно. Выполнение инструкций в WHILE
цикле можно контролировать внутри цикла с помощью BREAK
ключевых слов и CONTINUE
ключевых слов.
Соглашения о синтаксисе Transact-SQL
Syntax
Синтаксис для 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 }
Arguments
boolean_expression
An expression that returns TRUE
or FALSE
. Если логическое выражение содержит SELECT
инструкцию, SELECT
оператор должен быть заключен в скобки.
{ sql_statement | statement_block }
Любая инструкция Transact-SQL или группирование инструкций в соответствии с блоком инструкций. Чтобы определить блок инструкций, используйте ключевые слова BEGIN
управления потоком и END
.
BREAK
Вызывает выход из самого WHILE
внутреннего цикла. Выполняются все операторы, которые отображаются после END
ключевого слова, помечая конец цикла.
CONTINUE
WHILE
Перезапуск цикла. Все операторы после ключевого CONTINUE
слова игнорируются.
CONTINUE
часто, но не всегда, открывается тестом IF
. For more information, see Control-of-Flow.
Remarks
Если вложены два или более WHILE
циклов, внутренний BREAK
выход из следующего внешнего цикла. Все инструкции после окончания внутреннего цикла выполняются в первую очередь, а затем перезапускается следующий внешний цикл.
Examples
Примеры кода в этой статье используют базу данных образца AdventureWorks2022
или AdventureWorksDW2022
, которую можно скачать с домашней страницы образцов и проектов сообщества Microsoft SQL Server и.
A. Использование 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 loop
В следующем примере, если средняя цена по списку продукта меньше $ 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