Partager via


PENDANT QUE (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Point de terminaison d’analytique SQL dans Microsoft FabricEntrepôt dans Microsoft FabricBase de données SQL dans Microsoft Fabric

Définit une condition pour l’exécution répétée d’une instruction SQL ou d’un bloc d’instructions. L'exécution des instructions se répète aussi longtemps que la condition spécifiée demeure vraie. L’exécution d’instructions dans la WHILE boucle peut être contrôlée à partir de l’intérieur de la boucle avec les mots clés et BREAK les CONTINUE mots clés.

Conventions de la syntaxe Transact-SQL

Syntax

Syntaxe pour SQL Server, Azure SQL Database, Azure SQL Managed Instance et Microsoft Fabric.

WHILE boolean_expression
    { sql_statement | statement_block | BREAK | CONTINUE }

Syntaxe pour Azure Synapse Analytics and Analytics Platform System (PDW).

WHILE boolean_expression
    { sql_statement | statement_block | BREAK }

Arguments

boolean_expression

Expression qui renvoie TRUE ou FALSE. Si l’expression booléenne contient une SELECT instruction, l’instruction SELECT doit être placée entre parenthèses.

{ sql_statement | statement_block }

Toute instruction Transact-SQL ou regroupement d’instructions tel que défini avec un bloc d’instructions. Pour définir un bloc d’instructions, utilisez les mots clés BEGIN de contrôle de flux et END.

BREAK

Provoque une sortie de la boucle la plus WHILE interne. Toutes les instructions qui apparaissent après le END mot clé, marquant la fin de la boucle, sont exécutées.

CONTINUE

Redémarre une WHILE boucle. Toutes les instructions après le CONTINUE mot clé sont ignorées. CONTINUE est fréquemment ouvert par un IF test, mais pas toujours. Pour plus d’informations, consultez Contrôle de flux.

Remarks

Si deux boucles ou plus WHILE sont imbriquées, l’intérieur BREAK se ferme à la boucle la plus externe suivante. Avant que la boucle précédente ne prenne le relais, toutes les instructions situées après la fin de la boucle intérieure sont d'abord exécutées.

Examples

Les exemples de code de cet article utilisent les bases de données d'exemple AdventureWorks2025 ou AdventureWorksDW2025, que vous pouvez télécharger à partir de la page d'accueil Microsoft SQL Server Samples and Community Projects.

A. Utiliser BREAK et CONTINUER avec if imbriqué... ELSE et WHILE

Dans l’exemple suivant, si le prix de liste moyen d’un produit est inférieur à 300 $, la WHILE boucle double les prix, puis sélectionne le prix maximal. Si le prix maximal est inférieur ou égal à 500 $, la WHILE boucle redémarre et double à nouveau les prix. Cette boucle continue de doubler les prix jusqu’à ce que le prix maximal soit supérieur à 500 $, puis quitte la WHILE boucle et imprime un message.

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. Utiliser WHILE dans un curseur

L'exemple suivant utilise @@FETCH_STATUS pour contrôler les activités d'un curseur dans une boucle 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

Exemples : Azure Synapse Analytics et Analytics Platform System (PDW)

C. Boucle WHILE

Dans l’exemple suivant, si le prix de liste moyen d’un produit est inférieur à 300 $, la WHILE boucle double les prix, puis sélectionne le prix maximal. Si le prix maximal est inférieur ou égal à 500 $, la WHILE boucle redémarre et double à nouveau les prix. Cette boucle continue de doubler les prix jusqu’à ce que le prix maximal soit supérieur à 500 $, puis quitte la WHILE boucle.

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