WHILE (Transact-SQL)

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 loop WHILE pode ser controlada internamente ao loop com as palavras-chave BREAK e CONTINUE.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

WHILE Boolean_expression 
     { sql_statement | statement_block | BREAK | CONTINUE } 

Argumentos

  • Boolean_expression
    É uma expressão que retorna TRUE ou FALSE. Se a expressão booliana contiver uma instrução SELECT, a instrução SELECT deverá ser incluída 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 e END de controle de fluxo.

  • BREAK
    Provoca uma saída do loop WHILE mais interno. Todas as instruções que apareçam depois da palavra-chave END, que marca o final do loop, serão executadas.

  • CONTINUE
    Faz com que o loop WHILE seja reiniciado, ignorando todas as instruções depois da palavra-chave CONTINUE.

Comentários

Se dois ou mais loops WHILE estiverem aninhados, o BREAK interno será encerrado 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

A. Usando BREAK e CONTINUE com ID...ELSE e WHILE aninhados

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. Se o preço máximo for menor ou igual a $500, o loop WHILE será reiniciado e dobrará novamente os preços. Esse loop continuará dobrando os preços até que o preço máximo seja maior que $500 e, então, sairá do loop WHILE e imprimirá uma mensagem.

USE AdventureWorks2008R2;
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. Usando WHILE em um cursor

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

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