Delen via


WHILE (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-database in Microsoft Fabric Preview

Hiermee stelt u een voorwaarde in voor de herhaalde uitvoering van een SQL-instructie of -instructieblok. De instructies worden herhaaldelijk uitgevoerd zolang de opgegeven voorwaarde waar is. De uitvoering van instructies in de WHILE lus kan worden beheerd vanuit de lus met de BREAK en CONTINUE trefwoorden.

Transact-SQL syntaxis-conventies

Syntax

Syntaxis voor SQL Server, Azure SQL Database, Azure SQL Managed Instance en Microsoft Fabric.

WHILE boolean_expression
    { sql_statement | statement_block | BREAK | CONTINUE }

Syntaxis voor Azure Synapse Analytics en Analytics Platform System (PDW).

WHILE boolean_expression
    { sql_statement | statement_block | BREAK }

Arguments

boolean_expression

Een expressie die retourneert TRUE of FALSE. Als de Boole-expressie een SELECT instructie bevat, moet de SELECT instructie tussen haakjes staan.

{ sql_statement | statement_block }

Elke Transact-SQL instructie of instructiegroep zoals gedefinieerd met een instructieblok. Als u een instructieblok wilt definiƫren, gebruikt u de trefwoorden BEGIN voor besturingsstromen en END.

BREAK

Veroorzaakt een uitgang van de binnenste WHILE lus. Alle instructies die na het END trefwoord worden weergegeven, waarbij het einde van de lus wordt gemarkeerd, worden uitgevoerd.

CONTINUE

Start een WHILE lus opnieuw op. Eventuele instructies na het CONTINUE trefwoord worden genegeerd. CONTINUE wordt vaak, maar niet altijd, geopend door een IF test. Zie Control-of-Flow voor meer informatie.

Remarks

Als twee of meer WHILE lussen zijn genest, gaat de binnenste BREAK lus naar de volgende buitenste lus. Alle instructies na het einde van de binnenste lus worden eerst uitgevoerd en vervolgens wordt de volgende buitenste lus opnieuw opgestart.

Examples

De codevoorbeelden in dit artikel gebruiken de AdventureWorks2022 of AdventureWorksDW2022 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .

A. GEBRUIK BREAK en CONTINUE met geneste ALS... ELSE en WHILE

Als in het volgende voorbeeld de gemiddelde catalogusprijs van een product lager is dan $ 300, verdubbelt de WHILE lus de prijzen en selecteert u vervolgens de maximumprijs. Als de maximumprijs lager is dan of gelijk is aan $ 500, start de WHILE lus opnieuw op en verdubbelt de prijzen opnieuw. Deze lus blijft de prijzen verdubbelen totdat de maximumprijs groter is dan $ 500 en sluit vervolgens de WHILE lus af en drukt een bericht af.

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. WHILE gebruiken in een cursor

In het volgende voorbeeld wordt gebruikgemaakt @@FETCH_STATUS van het beheren van cursoractiviteiten in een WHILE lus.

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

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

C. WHILE loop

Als in het volgende voorbeeld de gemiddelde catalogusprijs van een product lager is dan $ 300, verdubbelt de WHILE lus de prijzen en selecteert u vervolgens de maximumprijs. Als de maximumprijs lager is dan of gelijk is aan $ 500, start de WHILE lus opnieuw op en verdubbelt de prijzen opnieuw. Deze lus blijft de prijzen verdubbelen totdat de maximumprijs groter is dan $ 500 en vervolgens de WHILE lus verlaat.

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