Utilisation de WHILE...BREAK ou de CONTINUE

L'instruction WHILE répète une instruction ou un bloc d'instructions tant qu'une condition définie est remplie.

Deux instructions Transact-SQL sont généralement utilisées avec WHILE : BREAK ou CONTINUE. L'instruction BREAK permet de quitter une boucle WHILE intérieure tandis que l'instruction CONTINUE relance une boucle WHILE. Un programme peut exécuter une instruction BREAK si, par exemple, il n'y a plus de lignes à traiter. Une instruction CONTINUE peut être utilisée si l'exécution du programme doit continuer.

[!REMARQUE]

Si une instruction SELECT est utilisée comme condition d'une instruction WHILE, l'instruction SELECT doit figurer entre parenthèses.

Exemples

A. Utilisation de WHILE dans un curseur

L'exemple suivant utilise une instruction WHILE pour contrôler le nombre d'extractions.

USE AdventureWorks;
GO
DECLARE abc CURSOR FOR
SELECT * FROM Purchasing.ShipMethod;
OPEN abc;
FETCH NEXT FROM abc
WHILE (@@FETCH_STATUS = 0)
   FETCH NEXT FROM abc;
CLOSE abc;
DEALLOCATE abc;
GO

Voici d'autres exemples de vérifications de condition avec WHILE :

WHILE (@ACounterVariable < 100)

Ou

WHILE EXISTS(SELECT LastName FROM Person.Contact WHERE FirstName = N'Anne')

B. Utilisation de BREAK et CONTINUE avec des IF…ELSE et des WHILE imbriqués

Dans l'exemple suivant, si le prix moyen d'un produit est inférieur à $300, la boucle WHILE double les prix puis sélectionne le prix maximum. Si le prix maximum est inférieur ou égal à $500, la boucle WHILE redémarre et double de nouveau les prix. Cette boucle continue à doubler les prix jusqu'à ce que le prix maximum soit supérieur à $500, puis le programme sort de la boucle WHILE et affiche un message.

USE AdventureWorks;
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';