Utilisation de l’instruction WHILE dans les procédures stockées

Après avoir lu cet article, vous comprendrez les bases de l’utilisation de l’instruction WHILE pour écrire une boucle dans une procédure stockée.

Tous les exemples de cette leçon sont basés sur Microsoft SQL Server Management Studio et les exemples de bases de données AdventureWorks et WideWorldImporters. Vous pouvez commencer à utiliser ces outils gratuits avec mon Guide Pour commencer à utiliser SQL Server.

WHILE, BREAK et CONTINUE

L’instruction WHILE est utilisée pour exécuter à plusieurs reprises un bloc d’instructions SQL. Le bloc est exécuté à plusieurs reprises si la condition de l’instruction WHILE est vraie.

Le format général des instructions WHILE est le suivant:

WHILE conditionBEGIN -- code block run when condition is TRUEEND

Si vous vous retrouvez à répéter des instructions, en particulier celles qui tombent dans un motif, il est possible que vous utilisiez une instruction WHILE pour enregistrer une frappe et rendre votre programme plus amusant à écrire!

Par exemple, supposons que vous devez créer une table temporaire contenant la date de début de chaque semaine. Bien sûr, nous pourrions écrire 52 instructions d’insertion individuelles, mais c’est ennuyeux!

INSERT INTO @myTable VALUES (0, 12/31/2017)INSERT INTO @myTable VALUES (1, 01/07/2018)INSERT INTO @myTable VALUES (2, 01/14/2018)…INSERT INTO @myTable VALUES (52, 12/30/2018 )

Utilisez plutôt la commande WHILE pour parcourir les 52 semaines, en insérant la date de début de chaque semaine dans le tableau. Vous pouvez voir comment nous procédons dans l’exemple suivant.

--Setup VariablesDECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'--Loop Through weeksWHILE @n <= 52BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1END--Show ResultsSELECT WeekNumber, DateStartingFROM @myTable

Ce qui fait que cette coche est la fonction DATEADD. Notez que DATEADD(sem, @n, @firstWeek) ajoute une semaine de travail de jours à notre date @firstWeek. Dans la première itération, il ajoute 0 semaines. Dans la deuxième itération, @ n = 1, donc il ajoute 1 semaine, et ainsi de suite.

Voici quelques points supplémentaires :

  • L’instruction WHILE teste la variable @n. S’il s’agit de <=52, le bloc programme (vert) peut s’exécuter.
  • Chaque fois que le bloc est exécuté, la variable @n est incrémentée de un. C’est important. Si cela ne se produisait pas, la valeur ne serait jamais supérieure à 52, et notre programme exécuterait le bloc de code, encore et encore, sans fin. C’est ce qu’on appelle une boucle infinie.
  • Renforcement au #2 ci-dessus! Il est important que votre boucle ait une condition de fin. Dans notre cas, nous nous assurons que la variable @n est incrémentée et qu’elle sera éventuellement supérieure à 52.
  • Nous utilisons la valeur @n pour « conduire » la valeur de date. En ajoutant des semaines à notre date de base, @firstWeek, nous pouvons calculer les dates de début de semaine suivantes.

Voici les résultats:

WHILE Statement Example Results

Comme vous pouvez le voir, à partir de cette simple boucle, nous avons pu créer des données intéressantes, et c’était plus amusant de faire wo en utilisant des fonctions de date, que de « coder en dur” l’instruction. L’utilisation de boucles est très puissante.

Utiliser BREAK pour court-circuiter une boucle

L’instruction BREAK est utilisée pour quitter de force le bloc de code d’une instruction WHILE.

Dans l’exemple suivant, nous avons modifié l’instruction WHILE. Il utilise maintenant l’instruction BREAK, qui est colorée en vert.

Il y a deux changements :

  1. La condition de l’instruction WHILE est toujours évaluée à TRUE, car @n est toujours supérieur ou égal à zéro.
  2. L’instruction IF teste la condition de fin et, lorsqu’elle est TRUE, exécute BREAK.
DECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'WHILE @n > -1BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1 IF @n > 52 BREAKEND

L’instruction BREAK est utile pour terminer l’exécution. Si les instructions WHILE sont imbriquées, la boucle la plus interne est terminée.

Utilisation de CONTINUE pour réinitialiser une boucle

L’instruction CONTINUE redémarre le bloc de code d’une instruction WHILE. Toutes les instructions trouvées après la SUITE ne sont pas exécutées.

Par exemple, dans ce qui suit, l’instruction PRINT n’est jamais exécutée.

DECLARE @myTable TABLE(WeekNumber int, DateStarting smalldatetime)DECLARE @n int = 0DECLARE @firstWeek smalldatetime = '12/31/2017'WHILE @n > -1BEGIN INSERT INTO @myTable VALUES (@n, DATEADD(wk,@n,@firstWeek)); SELECT @n = @n + 1 IF @n > 52 BREAK ELSE CONTINUE PRINT ‘I Never get executed’END

La raison en est soit que l’instruction BREAK force une SORTIE, soit que lorsque CONTINUE est exécutée, la boucle est réinitialisée au début du bloc.



Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.