WHILE (Transact-SQL)
Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)Ponto de extremidade de SQL no Microsoft FabricWarehouse no Microsoft Fabric
Define uma condição para a execução repetida de uma instrução ou um bloco de instruções SQL. 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 SQL do Azure e Microsoft Fabric.
WHILE boolean_expression
{ sql_statement | statement_block | BREAK | CONTINUE }
Sintaxe do Azure Synapse Analytics e do Analytics Platform System (PDW).
WHILE boolean_expression
{ sql_statement | statement_block | BREAK }
Observação
Para exibir a sintaxe do Transact-SQL para o SQL Server 2014 (12.x) e versões anteriores, confira a Documentação das versões anteriores.
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ção. Para definir um bloco de instrução, use as palavras-chave BEGIN
controle de fluxo e END
.
BREAK
Provoca uma saída do loop mais WHILE
interno. Todas as instruções que aparecem após a END
palavra-chave, marcando o final do loop, são executadas.
CONTINUE
Reinicia um WHILE
loop. Quaisquer instruções após a CONTINUE
palavra-chave são ignoradas. CONTINUE
é frequentemente, 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 loop interno BREAK
será executado para o próximo loop 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 SE... 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. Usar ENQUANTO 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
Conteúdo relacionado
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários