Partager via


WHILE (Transact-SQL)

S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL analytics endpoint in Microsoft Fabric Warehouse in 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 CONTINUE les BREAK mots clés.

Conventions de la syntaxe Transact-SQL

Syntaxe

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.

Notes

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.

Exemples

Les exemples de code Transact-SQL de cet article sont fondés sur l’échantillon de base de données AdventureWorks2022 ou AdventureWorksDW2022 fourni, que vous pouvez télécharger à partir de la page d’accueil Échantillons et projets communautaires Microsoft SQL Server.

R : 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