Existe-t-il une méthode pour implémenter la do while
boucle dans SQL Server 2008?
Existe-t-il une méthode pour implémenter la do while
boucle dans SQL Server 2008?
Réponses:
Je ne suis pas sûr de DO-WHILE DANS MS SQL Server 2008 mais vous pouvez changer votre logique de boucle WHILE, de manière à utiliser comme une boucle DO-WHILE.
Des exemples sont tirés d'ici: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of- While - loop - with - continue- and- break - keywords/
Exemple de boucle WHILE
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 END GO
ResultSet:
1 2 3 4 5
Exemple de boucle WHILE avec le mot clé BREAK
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 IF @intFlag = 4 BREAK; END GO
ResultSet:
1 2 3
Exemple de boucle WHILE avec les mots clés CONTINUE et BREAK
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 CONTINUE; IF @intFlag = 4 -- This will never executed BREAK; END GO
ResultSet:
1 2 3 4 5
Mais essayez d' éviter les boucles au niveau de la base de données. Référence .
Si vous n'êtes pas très offensé par le GOTO
mot - clé, il peut être utilisé pour simuler un DO
/ WHILE
dans T-SQL. Prenons l'exemple suivant, plutôt absurde, écrit en pseudocode:
SET I=1
DO
PRINT I
SET I=I+1
WHILE I<=10
Voici le code T-SQL équivalent utilisant goto:
DECLARE @I INT=1;
START: -- DO
PRINT @I;
SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10
Notez le mappage un à un entre la GOTO
solution activée et le DO
/ WHILE
pseudo - code d'origine. Une implémentation similaire utilisant une WHILE
boucle ressemblerait à ceci:
DECLARE @I INT=1;
WHILE (1=1) -- DO
BEGIN
PRINT @I;
SET @I+=1;
IF NOT (@I<=10) BREAK; -- WHILE @I<=10
END
Maintenant, vous pouvez bien sûr réécrire cet exemple particulier comme une simple WHILE
boucle, car ce n'est pas un si bon candidat pour une construction DO
/ WHILE
. L'accent était mis sur la brièveté de l'exemple plutôt que sur l'applicabilité, car les cas légitimes nécessitant un DO
/ WHILE
sont rares.
REPEAT / JUSQU'À, n'importe qui (ne fonctionne PAS en T-SQL)?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
... et la GOTO
solution basée sur T-SQL:
DECLARE @I INT=1;
START: -- REPEAT
PRINT @I;
SET @I+=1;
IF NOT(@I>10) GOTO START; -- UNTIL @I>10
Grâce à l'utilisation créative GOTO
et à l'inversion de logique via le NOT
mot - clé, il existe une relation très étroite entre le pseudo-code d'origine et la GOTO
solution basée. Une solution similaire utilisant une WHILE
boucle ressemble à ceci:
DECLARE @I INT=1;
WHILE (1=1) -- REPEAT
BEGIN
PRINT @I;
SET @I+=1;
IF @I>10 BREAK; -- UNTIL @I>10
END
Un argument peut être fait que pour le cas du REPEAT
/ UNTIL
, la WHILE
solution basée est plus simple, car la condition if n'est pas inversée. D'un autre côté, il est également plus verbeux.
S'il n'y avait pas tout le mépris autour de l'utilisation de GOTO
, il pourrait même s'agir de solutions idiomatiques pour les rares fois où ces constructions de boucle (mal) particulières sont nécessaires dans le code T-SQL pour des raisons de clarté.
Utilisez-les à votre propre discrétion, en essayant de ne pas subir la colère de vos collègues développeurs lorsqu'ils vous surprennent à utiliser le très décrié GOTO
.
Il me semble me souvenir d'avoir lu cet article plus d'une fois, et la réponse n'est que proche de ce dont j'ai besoin.
Habituellement, quand je pense que je vais avoir besoin d'un DO WHILE
en T-SQL, c'est parce que j'itère un curseur et que je recherche en grande partie une clarté optimale (par rapport à une vitesse optimale). Dans T-SQL, cela semble correspondre à un WHILE TRUE
/ IF BREAK
.
Si c'est le scénario qui vous a amené ici, cet extrait de code peut vous faire gagner un instant. Sinon, bon retour, moi. Maintenant, je peux être certain que je suis venu ici plus d'une fois. :)
DECLARE Id INT, @Title VARCHAR(50)
DECLARE Iterator CURSOR FORWARD_ONLY FOR
SELECT Id, Title FROM dbo.SourceTable
OPEN Iterator
WHILE 1=1 BEGIN
FETCH NEXT FROM @InputTable INTO @Id, @Title
IF @@FETCH_STATUS < 0 BREAK
PRINT 'Do something with ' + @Title
END
CLOSE Iterator
DEALLOCATE Iterator
Malheureusement, T-SQL ne semble pas offrir un moyen plus propre de définir individuellement l'opération de boucle que cette boucle infinie.
Vous pouvez également utiliser une variable de sortie si vous souhaitez que votre code soit un peu plus lisible:
DECLARE @Flag int = 0
DECLARE @Done bit = 0
WHILE @Done = 0 BEGIN
SET @Flag = @Flag + 1
PRINT @Flag
IF @Flag >= 5 SET @Done = 1
END
Ce serait probablement plus pertinent lorsque vous avez une boucle plus compliquée et que vous essayez de garder une trace de la logique. Comme indiqué, les boucles sont chères, alors essayez d'utiliser d'autres méthodes si vous le pouvez.
Only While Loop est officiellement pris en charge par le serveur SQL. Il y a déjà une réponse pour DO while loop. Je détaille la réponse sur les moyens de réaliser différents types de boucles dans le serveur SQL.
Si vous savez, vous devez quand même terminer la première itération de la boucle, alors vous pouvez essayer la version DO..WHILE ou REPEAT..UNTIL du serveur SQL.
DECLARE @X INT=1;
WAY: --> Here the DO statement
PRINT @X;
SET @X += 1;
IF @X<=10 GOTO WAY;
DECLARE @X INT = 1;
WAY: -- Here the REPEAT statement
PRINT @X;
SET @X += 1;
IFNOT(@X > 10) GOTO WAY;
DECLARE @cnt INT = 0;
WHILE @cnt < 10
BEGIN
PRINT 'Inside FOR LOOP';
SET @cnt = @cnt + 1;
END;
PRINT 'Done FOR LOOP';