Condividi tramite


Utilizzo di WHILE...BREAK o CONTINUE

L'istruzione WHILE consente di ripetere un'istruzione o un blocco di istruzioni fintanto che una condizione specifica risulta vera.

Con WHILE: BREAK o CONTINUE vengono in genere utilizzate due istruzioni Transact-SQL. L'istruzione BREAK consente di uscire dal ciclo WHILE più interno, mentre l'istruzione CONTINUE riavvia un ciclo WHILE. Un programma esegue un'istruzione BREAK se, ad esempio, non esistono altre righe da elaborare. Viene invece eseguita un'istruzione CONTINUE se, ad esempio, l'esecuzione del codice deve continuare.

[!NOTA]

L'istruzione SELECT deve essere racchiusa tra parentesi quando viene utilizzata come condizione per l'istruzione WHILE.

Esempi

A. Utilizzo di WHILE in un cursore

Nell'esempio seguente viene utilizzata un'istruzione WHILE per controllare il numero di operazioni di recupero eseguite:

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

Altri metodi validi per verificare la condizione di WHILE sono i seguenti:

WHILE (@ACounterVariable < 100)

Oppure

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

B. Utilizzo di BREAK e CONTINUE con cicli IF...ELSE e WHILE nidificati

Nell'esempio seguente, se il prezzo medio di listino di un prodotto è minore di $300, il ciclo WHILE raddoppia i prezzi e quindi seleziona il prezzo massimo. Se il prezzo massimo è minore o uguale a $500, il ciclo WHILE viene riavviato e il prezzo nuovamente raddoppiato. Questo ciclo continua a raddoppiare i prezzi fino a quando il prezzo massimo non supera $500, quindi il ciclo WHILE viene terminato e viene stampato un messaggio.

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