Faire en boucle dans SQL Server 2008
-
11-10-2019 - |
Question
Y at-il une méthode pour la mise en œuvre de la boucle do while
dans le serveur SQL 2008?
La solution
Je ne suis pas sûr de DO-LORSQU'IL MS SQL Server 2008, mais vous pouvez modifier votre logique de boucle while, de manière à utiliser comme boucle do-while.
Les exemples sont prises 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 mot-clé PAUSE
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 des mots-clés PAUSE CONTINUE et
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 boucles ÉVITEZ au niveau de la base de données.
Autres conseils
Si vous n'êtes pas très offensé par le mot-clé GOTO
, 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 en utilisant goto:
DECLARE @I INT=1;
START: -- DO
PRINT @I;
SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10
Indication celui à un entre le GOTO
activé solution et le pseudocode DO
/ WHILE
d'origine. Une implémentation similaire en utilisant une boucle de WHILE
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 réécrire bien sûr cet exemple comme une simple boucle de WHILE
, puisque ce n'est pas un bon candidat pour un DO
/ WHILE
construction. L'accent était mis sur la brièveté de l'exemple plutôt que d'application, puisque les cas légitimes nécessitant une DO
/ WHILE
sont rares.
REPEAT / UNTIL, tout le monde (ne fonctionne pas dans T-SQL)?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
... et la solution à base de GOTO
dans 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 inversion logique via le mot-clé NOT
, il existe une relation très étroite entre le pseudo-code original et la solution de GOTO
. Une solution similaire en utilisant une apparence de boucle WHILE
comme:
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 dans le cas du REPEAT
/ UNTIL
, la solution à base de WHILE
est plus simple, car la condition if est pas inversée. D'autre part, il est plus bavard.
Si ce n'était pas pour tout le mépris autour de l'utilisation de GOTO
, ceux-ci pourraient même être des solutions idiomatiques pour ces quelques moments où ces particulier (mal) des constructions en boucle nécessaires dans le code T-SQL pour un souci de clarté.
Utilisez-les à votre propre discrétion, essayant de ne pas subir les foudres de vos collègues développeurs quand ils vous attrapent en utilisant le GOTO
beaucoup décrié.
Je me souviens avoir lu cet article plus d'une fois, et la réponse est que Fermer à ce que je dois.
En général, quand je pense que je vais avoir besoin d'un DO WHILE
dans T-SQL, il est parce que je suis un curseur itérer, et je suis à la recherche en grande partie pour une clarté optimale (par rapport à la vitesse optimale). Dans T-SQL qui semble correspondre un WHILE TRUE
/ IF BREAK
.
Si tel est le scénario qui vous a amené ici, cet extrait peut vous faire économiser un moment. Sinon, bienvenue, moi. Maintenant, je peux être certain que je suis 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 à des liaisons simples définir le fonctionnement en boucle, que cette boucle infinie.
Vous pouvez également utiliser une variable de sortie si vous voulez 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 essayez de garder une trace de la logique. Comme les boucles indiquées sont chères et donc essayer d'utiliser d'autres méthodes si vous le pouvez.
Seulement while officiellement pris en charge par le serveur SQL. Déjà il y a réponse pour faire en boucle. Je DETAILING réponse sur les moyens de réaliser différents types de boucles dans le serveur SQL.
Si vous le savez, vous devez d'abord l'itération complète de la boucle de toute façon, alors vous pouvez essayer do..while ou REPEAT..UNTIL version du serveur SQL.
do..while boucle
DECLARE @X INT=1;
WAY: --> Here the DO statement
PRINT @X;
SET @X += 1;
IF @X<=10 GOTO WAY;
REPEAT..UNTIL boucle
DECLARE @X INT = 1;
WAY: -- Here the REPEAT statement
PRINT @X;
SET @X += 1;
IFNOT(@X > 10) GOTO WAY;
boucle FOR
DECLARE @cnt INT = 0;
WHILE @cnt < 10
BEGIN
PRINT 'Inside FOR LOOP';
SET @cnt = @cnt + 1;
END;
PRINT 'Done FOR LOOP';