WHILE (Transact-SQL)
Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW) Endpoint di analisi SQL in Microsoft Fabric Warehouse in Microsoft Fabric
Imposta una condizione per l'esecuzione ripetuta di un'istruzione SQL o di un blocco di istruzioni. Le istruzioni vengono eseguite ripetutamente per tutto il tempo in cui la condizione specificata risulta vera. L'esecuzione di istruzioni nel WHILE
ciclo può essere controllata dall'interno del ciclo con le BREAK
parole chiave e CONTINUE
.
Convenzioni relative alla sintassi Transact-SQL
Sintassi
Sintassi per SQL Server, database SQL di Azure, Istanza gestita di SQL di Azure e Microsoft Fabric.
WHILE boolean_expression
{ sql_statement | statement_block | BREAK | CONTINUE }
Sintassi per Azure Synapse Analytics and Analytics Platform System (PDW).
WHILE boolean_expression
{ sql_statement | statement_block | BREAK }
Argomenti
boolean_expression
Espressione che restituisce TRUE
o FALSE
. Se l'espressione booleana contiene un'istruzione SELECT
, l'istruzione SELECT
deve essere racchiusa tra parentesi.
{ sql_statement | statement_block }
Qualsiasi istruzione Transact-SQL o raggruppamento di istruzioni come definito con un blocco di istruzioni. Per definire un blocco di istruzioni, usare le parole chiave BEGIN
control-of-flow e END
.
BREAK
Determina un'uscita dal ciclo più WHILE
interno. Vengono eseguite tutte le istruzioni visualizzate dopo la END
parola chiave, che contrassegna la fine del ciclo.
CONTINUE
Riavvia un WHILE
ciclo. Qualsiasi istruzione dopo che la CONTINUE
parola chiave viene ignorata. CONTINUE
è spesso, ma non sempre, aperto da un IF
test. Per altre informazioni, vedere Controllo del flusso.
Osservazioni:
Se due o più WHILE
cicli sono annidati, l'interno BREAK
esce dal ciclo più esterno successivo. Vengono eseguite tutte le istruzioni successive al ciclo più interno, quindi viene riavviato il ciclo successivo più esterno.
Esempi
Gli esempi di codice Transact-SQL in questo articolo utilizzano il database campione AdventureWorks2022
o AdventureWorksDW2022
, che è possibile scaricare dalla home page di Esempi di Microsoft SQL Server e progetti collettivi.
R. Usare BREAK e CONTINUE con IF annidato... ELSE e WHILE
Nell'esempio seguente, se il prezzo medio di listino di un prodotto è minore di $300, il WHILE
ciclo raddoppia i prezzi e quindi seleziona il prezzo massimo. Se il prezzo massimo è minore o uguale a $500, il WHILE
ciclo viene riavviato e raddoppia di nuovo i prezzi. Questo ciclo continua a raddoppiare i prezzi fino a quando il prezzo massimo è maggiore di $ 500, quindi esce dal WHILE
ciclo e stampa un messaggio.
USE AdventureWorks2022;
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. Usare WHILE in un cursore
Nell'esempio seguente viene utilizzata la funzione @@FETCH_STATUS
per controllare le attività del cursore in un ciclo WHILE
.
DECLARE @EmployeeID AS NVARCHAR(256)
DECLARE @Title AS NVARCHAR(50)
DECLARE Employee_Cursor CURSOR
FOR
SELECT LoginID,
JobTitle
FROM AdventureWorks2022.HumanResources.Employee
WHERE JobTitle = 'Marketing Specialist';
OPEN Employee_Cursor;
FETCH NEXT
FROM Employee_Cursor
INTO @EmployeeID,
@Title;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT ' ' + @EmployeeID + ' ' + @Title
FETCH NEXT
FROM Employee_Cursor
INTO @EmployeeID,
@Title;
END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
GO
Esempi: Azure Synapse Analytics e Piattaforma di strumenti analitici (PDW)
C: Ciclo WHILE
Nell'esempio seguente, se il prezzo medio di listino di un prodotto è minore di $300, il WHILE
ciclo raddoppia i prezzi e quindi seleziona il prezzo massimo. Se il prezzo massimo è minore o uguale a $500, il WHILE
ciclo viene riavviato e raddoppia di nuovo i prezzi. Questo ciclo continua a raddoppiare i prezzi fino a quando il prezzo massimo è maggiore di $ 500 e quindi esce dal WHILE
ciclo.
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