WHILE (Transact-SQL)WHILE (Transact-SQL)

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simAzure Synapse Analytics (SQL DW) simParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Define uma condição para a execução repetida de uma instrução ou um bloco de instruções SQL.Sets a condition for the repeated execution of an SQL statement or statement block. As instruções serão executadas repetidamente desde que a condição especificada seja verdadeira.The statements are executed repeatedly as long as the specified condition is true. A execução de instruções no loop WHILE pode ser controlada internamente ao loop com as palavras-chave BREAK e CONTINUE.The execution of statements in the WHILE loop can be controlled from inside the loop with the BREAK and CONTINUE keywords.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

-- Syntax for SQL Server and Azure SQL Database  
  
WHILE Boolean_expression   
     { sql_statement | statement_block | BREAK | CONTINUE }  
  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
  
WHILE Boolean_expression   
     { sql_statement | statement_block | BREAK }  
  

ArgumentosArguments

Boolean_expressionBoolean_expression
É uma expression que retorna TRUE ou FALSE.Is an expression that returns TRUE or FALSE. Se a expressão booliana contiver uma instrução SELECT, a instrução SELECT deverá ser incluída entre parênteses.If the Boolean expression contains a SELECT statement, the SELECT statement must be enclosed in parentheses.

{sql_statement | statement_block}{sql_statement | statement_block}
É qualquer instrução Transact-SQLTransact-SQL ou agrupamento de instruções, conforme definido com um bloco de instruções.Is any Transact-SQLTransact-SQL statement or statement grouping as defined with a statement block. Para definir um bloco de instruções, use as palavras-chave BEGIN e END de controle de fluxo.To define a statement block, use the control-of-flow keywords BEGIN and END.

BREAKBREAK
Provoca uma saída do loop WHILE mais interno.Causes an exit from the innermost WHILE loop. Todas as instruções que apareçam depois da palavra-chave END, que marca o final do loop, serão executadas.Any statements that appear after the END keyword, marking the end of the loop, are executed.

CONTINUECONTINUE
Faz com que o loop WHILE seja reiniciado, ignorando todas as instruções depois da palavra-chave CONTINUE.Causes the WHILE loop to restart, ignoring any statements after the CONTINUE keyword.

RemarksRemarks

Se dois ou mais loops WHILE estiverem aninhados, o BREAK interno será encerrado para o próximo loop mais externo.If two or more WHILE loops are nested, the inner BREAK exits to the next outermost loop. Todas as instruções após o fim da primeira execução do loop interno e o loop mais externo seguinte serão reiniciadas.All the statements after the end of the inner loop run first, and then the next outermost loop restarts.

ExemplosExamples

A.A. Usando BREAK e CONTINUE com IF...ELSE e WHILE aninhadosUsing BREAK and CONTINUE with nested IF...ELSE and WHILE

No exemplo a seguir, se o preço médio de tabela de um produto for menor que $300, o loop WHILE dobrará os preços e selecionará o preço máximo.In the following example, if the average list price of a product is less than $300, the WHILE loop doubles the prices and then selects the maximum price. Se o preço máximo for menor ou igual a $500, o loop WHILE será reiniciado e dobrará novamente os preços.If the maximum price is less than or equal to $500, the WHILE loop restarts and doubles the prices again. Esse loop continuará dobrando os preços até que o preço máximo seja maior que $500; em seguida, sairá do loop WHILE e imprimirá uma mensagem.This loop continues doubling the prices until the maximum price is greater than $500, and then exits the WHILE loop and prints a message.

USE AdventureWorks2012;  
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.B. Usando WHILE em um cursorUsing WHILE in a cursor

O exemplo a seguir usa @@FETCH_STATUS para controlar atividades de cursor em um loop WHILE.The following example uses @@FETCH_STATUS to control cursor activities in a WHILE loop.

DECLARE @EmployeeID as nvarchar(256)
DECLARE @Title as nvarchar(50)

DECLARE Employee_Cursor CURSOR FOR  
SELECT LoginID, JobTitle   
FROM AdventureWorks2012.HumanResources.Employee  
WHERE JobTitle = 'Marketing Specialist';  
OPEN Employee_Cursor;  
FETCH NEXT FROM Employee_Cursor;  
FETCH NEXT FROM Employee_Cursor INTO @EmployeeID, @Title;  
WHILE @@FETCH_STATUS = 0  
   BEGIN  
      Print '   ' + @EmployeeID + '      '+  @Title 
      FETCH NEXT FROM Employee_Cursor;  
   END;  
CLOSE Employee_Cursor;  
DEALLOCATE Employee_Cursor;  
GO 

Exemplos: Azure Synapse Analytics (SQL DW)Azure Synapse Analytics (SQL DW) e Parallel Data WarehouseParallel Data WarehouseExamples: Azure Synapse Analytics (SQL DW)Azure Synapse Analytics (SQL DW) and Parallel Data WarehouseParallel Data Warehouse

C: Loop While simplesC: Simple While Loop

No exemplo a seguir, se o preço médio de tabela de um produto for menor que $300, o loop WHILE dobrará os preços e selecionará o preço máximo.In the following example, if the average list price of a product is less than $300, the WHILE loop doubles the prices and then selects the maximum price. Se o preço máximo for menor ou igual a $500, o loop WHILE será reiniciado e dobrará novamente os preços.If the maximum price is less than or equal to $500, the WHILE loop restarts and doubles the prices again. Esse loop continuará dobrando os preços até que o preço máximo seja maior que $500; em seguida, sairá do loop WHILE.This loop continues doubling the prices until the maximum price is greater than $500, and then exits the WHILE loop.

-- Uses AdventureWorks  
  
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  
  

Consulte TambémSee Also

ALTER TRIGGER (Transact-SQL) ALTER TRIGGER (Transact-SQL)
Linguagem de controle de fluxo (Transact-SQL) Control-of-Flow Language (Transact-SQL)
CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
Cursores (Transact-SQL) Cursors (Transact-SQL)
SELECT (Transact-SQL)SELECT (Transact-SQL)