it-swarm.com.de

Führen Sie eine Schleife in SQL Server 2008 aus

Gibt es eine Methode zum Implementieren der do while-Schleife in SQL Server 2008?

113
Nithesh

Ich bin nicht sicher über DO-WHILE in MS SQL Server 2008, aber Sie können Ihre WHILE-Schleifenlogik ändern, um sie wie eine DO-WHILE-Schleife zu verwenden.

Beispiele finden Sie hier: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of-while-loop-with-continue-und-break-keywords/

  1. Beispiel für eine WHILE-Schleife

    DECLARE @intFlag INT
    SET @intFlag = 1
    WHILE (@intFlag <=5)
    BEGIN
        PRINT @intFlag
        SET @intFlag = @intFlag + 1
    END
    GO
    

    Ergebnissatz:

    1
    2
    3
    4
    5
    
  2. Beispiel für eine WHILE-Schleife mit dem Schlüsselwort BREAK

    DECLARE @intFlag INT
    SET @intFlag = 1
    WHILE (@intFlag <=5)
    BEGIN
        PRINT @intFlag
        SET @intFlag = @intFlag + 1
        IF @intFlag = 4
            BREAK;
    END
    GO
    

    Ergebnissatz:

    1
    2
    3
    
  3. Beispiel für eine WHILE-Schleife mit den Schlüsselwörtern CONTINUE und 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
    

    Ergebnissatz:

    1
    2
    3
    4
    5
    

Versuchen Sie jedoch vermeiden Sie Schleifen auf Datenbankebene . Referenz .

176
Pratik

Wenn Sie mit dem Schlüsselwort GOTO nicht sehr beleidigt sind, können Sie es verwenden, um eine DO/WHILE in T-SQL zu simulieren. Betrachten Sie das folgende ziemlich unsinnige Beispiel im Pseudocode:

SET I=1
DO
 PRINT I
 SET I=I+1
WHILE I<=10

Hier ist der äquivalente T-SQL-Code, der goto verwendet:

DECLARE @I INT=1;
START:                -- DO
  PRINT @I;
  SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10

Beachten Sie die Eins-zu-Eins-Zuordnung zwischen der GOTO-aktivierten Lösung und dem ursprünglichen DO/WHILE-Pseudocode. Eine ähnliche Implementierung mit einer WHILE-Schleife würde folgendermaßen aussehen:

DECLARE @I INT=1;
WHILE (1=1)              -- DO
 BEGIN
  PRINT @I;
  SET @I+=1;
  IF NOT (@I<=10) BREAK; -- WHILE @I<=10
 END

Jetzt können Sie dieses spezielle Beispiel natürlich als einfache WHILE-Schleife umschreiben, da dies kein guter Kandidat für ein DO/WHILE-Konstrukt ist. Der Schwerpunkt lag auf der Kürze der Beispiele und nicht auf der Anwendbarkeit, da legitime Fälle, die eine DO/WHILE erfordern, selten sind.


REPEAT/UNTIL jedermann (funktioniert NICHT in T-SQL)?

SET I=1
REPEAT
  PRINT I
  SET I=I+1
UNTIL I>10

... und die GOTO-basierte Lösung in T-SQL:

DECLARE @I INT=1;
START:                    -- REPEAT
  PRINT @I;
  SET @I+=1;
IF NOT(@I>10) GOTO START; -- UNTIL @I>10

Durch die kreative Verwendung von GOTO und der Logikinversion über das Schlüsselwort NOT besteht eine sehr enge Beziehung zwischen dem ursprünglichen Pseudocode und der auf GOTO basierenden Lösung. Eine ähnliche Lösung mit einer WHILE-Schleife sieht folgendermaßen aus:

DECLARE @I INT=1;
WHILE (1=1)       -- REPEAT
 BEGIN
  PRINT @I;
  SET @I+=1;
  IF @I>10 BREAK; -- UNTIL @I>10
 END

Es kann argumentiert werden, dass für den Fall der REPEAT/UNTIL die auf WHILE basierende Lösung einfacher ist, da die if-Bedingung nicht invertiert ist. Andererseits ist es auch ausführlicher.

Wenn die Verwendung von GOTO nicht für alle missbilligend wäre, könnten dies sogar idiomatische Lösungen für die wenigen Fälle sein, in denen diese (schlechten) Schleifenkonstrukte aus Gründen der Klarheit in T-SQL-Code erforderlich sind.

Verwenden Sie diese nach Ihrem eigenen Ermessen und versuchen Sie, den Zorn Ihrer Entwickler nicht zu erdulden, wenn sie Sie mit der viel bösartigen GOTO erwischen.

57

Ich scheine mich zu erinnern, diesen Artikel mehr als einmal gelesen zu haben, und die Antwort ist nur nah was ich brauche.

Normalerweise, wenn ich denke, dass ich einen DO WHILE in T-SQL brauche, liegt das daran, dass ich einen Cursor durchläuft und größtenteils nach optimaler Klarheit (vs. optimaler Geschwindigkeit) suche. In T-SQL scheint dies auf einen WHILE TRUE/IF BREAK zu passen.

Wenn dies das Szenario ist, das Sie hierher gebracht hat, kann Ihnen dieser Ausschnitt einen Moment sparen. Ansonsten willkommen zurück, ich. Jetzt kann ich sicher sein, dass ich schon mehr als einmal hier war. :)

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

Leider scheint T-SQL keine sauberere Methode zu bieten, um die Schleifenoperation eindeutig zu definieren, als diese Endlosschleife.

18
shannon

Sie können auch eine Exit-Variable verwenden, wenn Ihr Code etwas lesbarer sein soll:

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

Dies ist wahrscheinlich relevanter, wenn Sie eine kompliziertere Schleife haben und versuchen, die Logik zu verfolgen. Wie gesagt, Schleifen sind teuer, probieren Sie andere Methoden aus, wenn Sie können.

4
Sebris87

Only While Loop wird offiziell vom SQL Server unterstützt. Es gibt bereits answer für DO while-Schleife. Ich erkläre Antworten auf Möglichkeiten, verschiedene Arten von Schleifen in SQL Server zu erreichen.

Wenn Sie wissen, dass Sie die erste Wiederholung der Schleife trotzdem abschließen müssen, können Sie die Version DO..WHILE oder REPEAT..UNTIL des SQL-Servers ausprobieren.

DO..WHILE-Schleife

DECLARE @X INT=1;

WAY:  --> Here the  DO statement

  PRINT @X;

  SET @X += 1;

IF @X<=10 GOTO WAY;

REPEAT..UNTIL-Schleife

DECLARE @X INT = 1;

WAY:  -- Here the REPEAT statement

  PRINT @X;

  SET @X += 1;

IFNOT(@X > 10) GOTO WAY;

FOR Loop

DECLARE @cnt INT = 0;

WHILE @cnt < 10
BEGIN
   PRINT 'Inside FOR LOOP';
   SET @cnt = @cnt + 1;
END;

PRINT 'Done FOR LOOP';

Referenz

0
Somnath Muluk