Question

Y at-il une méthode pour la mise en œuvre de la boucle do while dans le serveur SQL 2008?

Était-ce utile?

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 /

  
      
  1. 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
    
  2.   
  3. 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
    
  4.   
  5. 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
    
  6.   

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';

Référence

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top