Dela via


WHILE (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

Anger ett villkor för upprepad körning av en SQL-instruktion eller instruktionsblock. Instruktionerna körs upprepade gånger så länge det angivna villkoret är sant. Körningen av -instruktioner i loopen WHILE kan styras inifrån loopen med nyckelorden BREAK och CONTINUE .

Transact-SQL syntaxkonventioner

Syntax

Syntax för SQL Server, Azure SQL Database, Azure SQL Managed Instance och Microsoft Fabric.

WHILE boolean_expression
    { sql_statement | statement_block | BREAK | CONTINUE }

Syntax för Azure Synapse Analytics and Analytics Platform System (PDW).

WHILE boolean_expression
    { sql_statement | statement_block | BREAK }

Arguments

boolean_expression

Ett uttryck som returnerar TRUE eller FALSE. Om det booleska uttrycket innehåller en SELECT -instruktion måste -instruktionen SELECT omges av parenteser.

{ sql_statement | statement_block }

Alla Transact-SQL-instruktion eller -instruktionsgruppering enligt definitionen med ett instruktionsblock. Om du vill definiera ett instruktionsblock använder du nyckelorden BEGIN control-of-flow och END.

BREAK

Orsakar ett avslut från den innersta WHILE loopen. Alla instruktioner som visas efter nyckelordet END , som markerar slutet av loopen, körs.

CONTINUE

Startar om en WHILE loop. Alla instruktioner efter nyckelordet CONTINUE ignoreras. CONTINUE ofta, men inte alltid, öppnas av ett IF test. Mer information finns i Kontroll av flöde.

Remarks

Om två eller flera WHILE loopar är kapslade avslutas den inre BREAK loopen till nästa yttersta loop. Alla instruktioner efter slutet av den inre loopen körs först och sedan startas nästa yttersta loop om.

Examples

Kodexemplen i den här artikeln använder AdventureWorks2022- eller AdventureWorksDW2022-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.

A. Använd BREAK och CONTINUE med kapslad IF... ELSE och WHILE

I följande exempel, om det genomsnittliga listpriset för en produkt är mindre än 300 USD, fördubblar loopen WHILE priserna och väljer sedan det maximala priset. Om det maximala priset är mindre än eller lika med 500 USD startar loopen WHILE om och fördubblar priserna igen. Den här loopen fortsätter att fördubbla priserna tills det maximala priset är större än 500 USD och avslutar sedan loopen WHILE och skriver ut ett meddelande.

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. Använda WHILE i en markör

I följande exempel används @@FETCH_STATUS för att styra marköraktiviteter i en WHILE loop.

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

Exempel: Azure Synapse Analytics and Analytics Platform System (PDW)

C. WHILE loop

I följande exempel, om det genomsnittliga listpriset för en produkt är mindre än 300 USD, fördubblar loopen WHILE priserna och väljer sedan det maximala priset. Om det maximala priset är mindre än eller lika med 500 USD startar loopen WHILE om och fördubblar priserna igen. Den här loopen fortsätter att fördubbla priserna tills det maximala priset är större än $ 500 och avslutar sedan loopen WHILE .

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