WHILE (Transact-SQL)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Управляемый экземпляр SQL Azure Конечная точка аналитики аналитики Synapse Analytics Analytics (PDW)SQL Analyticsв Microsoft FabricХранилище в 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 }

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

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 пример базы данных, которую можно скачать на домашней странице примеров и проектов сообщества 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