Condividi tramite


WHILE (Transact-SQL)

Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure endpoint di analisi SQL di Azure Synapse Analytics Platform System (PDW) in Microsoft Fabric Warehouse nel database SQL di Microsoft Fabric 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