WHILE (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System) Ponto de extremidade de análise do SQL Warehouse no Microsoft Fabric

Define uma condição para a execução repetida de uma instrução SQL ou bloco de instruções. As instruções serã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 .

Convenções de sintaxe de Transact-SQL

Sintaxe

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

WHILE boolean_expression
    { sql_statement | statement_block | BREAK | CONTINUE }

Sintaxe para Azure Synapse Analytics e PDW (Analytics Platform System).

WHILE boolean_expression
    { sql_statement | statement_block | BREAK }

Argumentos

boolean_expression

Uma expressão que retorna TRUE ou FALSE. Se a expressão booleana contiver uma SELECT instrução, a SELECT instrução deverá 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ção, use as palavras-chave BEGIN de controle de fluxo e END.

BREAK

Causa uma saída do loop mais WHILE interno. Todas as instruções que aparecem após a END palavra-chave, 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 é freqüentemente, mas nem sempre, aberto por um IF teste. Para obter mais informações, consulte Controle de fluxo.

Comentários

Se dois ou mais WHILE loops estiverem aninhados, o interno BREAK sairá para o próximo loop mais externo. Todas as instruções após o fim da primeira execução do loop interno e o loop mais externo seguinte serão reiniciadas.

Exemplos

Os exemplos de código do Transact-SQL deste artigo usa o banco de dados de exemplo AdventureWorks2022 ou AdventureWorksDW2022, que pode ser baixado da home page Microsoft SQL Server Samples and Community Projects.

R. Use BREAK e CONTINUE com IF... ELSE e ENQUANTO

No exemplo a seguir, se o preço de tabela médio de um produto for inferior a US$ 300, o WHILE loop dobrará os preços e selecionará o preço máximo. Se o preço máximo for menor ou igual a US$ 500, o WHILE loop será reiniciado e dobrará os preços novamente. Esse loop continua dobrando os preços até que o preço máximo seja maior que US$ 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 atividades de cursor em um loop 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

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

C: Loop WHILE

No exemplo a seguir, se o preço de tabela médio de um produto for inferior a US$ 300, o WHILE loop dobrará os preços e selecionará o preço máximo. Se o preço máximo for menor ou igual a US$ 500, o WHILE loop será reiniciado e dobrará os preços novamente. Esse loop continua dobrando os preços até que o preço máximo seja maior que US$ 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