Existe-t-il une méthode pour mettre en œuvre do while
boucle dans SQL server 2008 ?
Réponses
Trop de publicités?Je ne suis pas sûr de l'utilisation de DO-WHILE dans MS SQL Server 2008, mais vous pouvez modifier la logique de votre boucle WHILE, de manière à l'utiliser comme une boucle DO-WHILE.
Les 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 de é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
le mot-clé, il peut être utilisé pour simuler une DO
/ WHILE
en T-SQL. Considérez 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
Remarquez la correspondance un à un entre le GOTO
et la solution originale DO
/ WHILE
pseudocode. Une implémentation similaire utilisant un WHILE
La boucle ressemblerait à ça :
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 pourriez bien sûr réécrire cet exemple particulier comme un simple WHILE
puisqu'il ne s'agit pas d'un très bon candidat pour une DO
/ WHILE
construire. L'accent a été mis sur la brièveté des exemples plutôt que sur leur applicabilité, puisque les cas légitimes nécessitant un DO
/ WHILE
sont rares.
REPEAT / UNTIL, quelqu'un ?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
... et le GOTO
en 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 de GOTO
et l'inversion logique via le NOT
il y a une relation très étroite entre le pseudo-code original et le GOTO
Une solution basée sur la technologie. Une solution similaire utilisant un WHILE
ressemble à une boucle :
DECLARE @I INT=1;
WHILE (1=1) -- REPEAT
BEGIN
PRINT @I;
SET @I+=1;
IF @I>10 BREAK; -- UNTIL @I>10
END
On peut argumenter que pour le cas de la REPEAT
/ UNTIL
le WHILE
est plus simple, car la condition if n'est pas inversée. D'un autre côté, elle est également plus verbeuse.
Si ce n'était pas pour tout le dédain autour de l'utilisation de GOTO
En outre, il peut s'agir de solutions idiomatiques pour les rares fois où ces constructions de boucles particulières (maléfiques) sont nécessaires dans le code T-SQL pour des raisons de clarté.
Utilisez-les à votre guise, en essayant de ne pas subir les foudres de vos collègues développeurs lorsqu'ils vous surprendront en train d'utiliser le très décrié GOTO
.
Je crois me souvenir avoir lu cet article plus d'une fois, et la réponse n'est que fermer à ce dont j'ai besoin.
Habituellement, quand je pense que je vais avoir besoin d'une DO WHILE
en T-SQL, c'est parce que j'itère un curseur, et que je cherche surtout à obtenir une clarté optimale (par rapport à une vitesse optimale). En T-SQL, cela semble correspondre à un WHILE TRUE
/ IF BREAK
.
Si c'est le scénario qui vous a amené ici, cet extrait peut vous faire gagner un moment. Sinon, bon retour, moi. Maintenant je peux être certain d'être 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 une façon plus propre de définir l'opération de la boucle, que cette boucle infinie.