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


WHILE (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в 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 }

Аргументы

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