118 votes

Boucle Do while en SQL Server 2008

Existe-t-il une méthode pour mettre en œuvre do while boucle dans SQL server 2008 ?

184voto

Pratik Points 3526

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/

  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. 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
  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 .

61voto

Michael Goldshteyn Points 24679

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 .

18voto

shannon Points 1979

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X