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