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 AdventureWorks2008R2;
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.Person 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 viene 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 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';