Partilhar via


ENQUANTO (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Ponto de Extremidade de Análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de Dados SQL no Microsoft Fabric

Define uma condição para a execução repetida de uma instrução SQL ou bloco de instrução. As instruções são executadas repetidamente, desde que a condição especificada seja verdadeira. A execução de instruções no WHILE loop pode ser controlada de dentro do loop com as BREAK palavras-chave e CONTINUE .

Transact-SQL convenções de sintaxe

Syntax

Sintaxe para SQL Server, Banco de Dados SQL do Azure, Instância Gerenciada SQL do Azure e Microsoft Fabric.

WHILE boolean_expression
    { sql_statement | statement_block | BREAK | CONTINUE }

Sintaxe para o Azure Synapse Analytics and Analytics Platform System (PDW).

WHILE boolean_expression
    { sql_statement | statement_block | BREAK }

Arguments

boolean_expression

Uma expressão que retorna TRUE ou FALSE. Se a expressão booleana contiver uma SELECT instrução, a SELECT instrução deve ser colocada entre parênteses.

{ sql_statement | statement_block }

Qualquer instrução Transact-SQL ou agrupamento de instruções conforme definido com um bloco de instruções. Para definir um bloco de instruções, use as palavras-chave BEGIN control-of-flow e END.

BREAK

Causa uma saída do loop mais WHILE interno. Todas as instruções que aparecem após a palavra-chave END , marcando o fim do loop, são executadas.

CONTINUE

Reinicia um WHILE loop. Todas as instruções após a CONTINUE palavra-chave são ignoradas. CONTINUE é frequentemente aberta, mas nem sempre, por um IF teste. Para obter mais informações, consulte Controle de fluxo.

Remarks

Se dois ou mais WHILE loops estiverem aninhados, o loop interno BREAK será retirado para o próximo loop externo. Todas as instruções após o final do loop interno são executadas primeiro e, em seguida, o próximo loop externo é reiniciado.

Examples

Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que pode ser descarregado da página inicial de Exemplos e Projetos da Comunidade do Microsoft SQL Server.

A. Use BREAK e CONTINUE com o IF aninhado... ELSE e WHILE

No exemplo a seguir, se o preço médio de tabela de um produto for inferior a US$ 300, o WHILE loop dobrará os preços e, em seguida, selecionará o preço máximo. Se o preço máximo for menor ou igual a $500, o WHILE loop reinicia e dobra os preços novamente. Esse loop continua dobrando os preços até que o preço máximo seja maior que $500 e, em seguida, sai do WHILE loop e imprime uma mensagem.

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. Use WHILE em um cursor

O exemplo a seguir usa @@FETCH_STATUS para controlar as atividades do cursor em um WHILE loop.

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

Exemplos: Azure Synapse Analytics and Analytics Platform System (PDW)

C. Loop WHILE

No exemplo a seguir, se o preço médio de tabela de um produto for inferior a US$ 300, o WHILE loop dobrará os preços e, em seguida, selecionará o preço máximo. Se o preço máximo for menor ou igual a $500, o WHILE loop reinicia e dobra os preços novamente. Esse loop continua dobrando os preços até que o preço máximo seja maior que $500 e, em seguida, sai do WHILE loop.

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