Domanda

Esiste un metodo per implementare ciclo do while in SQL Server 2008?

È stato utile?

Soluzione

Non sono sicuro di do-while in MS SQL Server 2008, ma è possibile cambiare la logica di ciclo WHILE, in modo da utilizzare come ciclo do-while.

Gli esempi sono tratti da qui: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of-while-loop-with-continue-and-break-keywords /

  1. Esempio di ciclo 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. Esempio di ciclo while con PAUSA parola chiave

    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. Esempio di ciclo while con CONTINUA e rompere le parole chiave

    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
    

Ma provate a loop Evita a livello di database. Riferimento .

Altri suggerimenti

Se non si è molto offeso dalla parola chiave GOTO, può essere utilizzato per simulare un DO / WHILE in T-SQL. Si consideri il seguente esempio piuttosto insensato scritto in pseudocodice:

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

Ecco il codice T-SQL equivalente utilizzando goto:

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

Si noti la mappatura uno a uno tra il GOTO abilitato soluzione e l'originale pseudocodice DO / WHILE. Una simile implementazione utilizzando un ciclo WHILE sarà simile:

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

Ora, si potrebbe ovviamente riscrivere questo particolare esempio come un semplice ciclo WHILE, dal momento che questo non è un tale buon candidato per un costrutto DO / WHILE. L'enfasi era sulla brevità esempio piuttosto che applicabilità, poiché i casi legittimi richiedono un DO / WHILE sono rare.


REPEAT / UNTIL, chiunque (non funziona in T-SQL)?

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

... e la soluzione basata GOTO in T-SQL:

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

Attraverso l'uso creativo di GOTO ed inversione logica tramite la parola NOT, c'è una stretta relazione tra il pseudocodice originale e la soluzione GOTO base. Una soluzione simile utilizzando un aspetto ciclo WHILE come:

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

Un argomento può essere fatto che per il caso del REPEAT / UNTIL, la soluzione basata WHILE è più semplice, perché la condizione non se è invertita. D'altra parte è anche più dettagliato.

Se non fosse per tutto il disprezzo intorno all'uso di GOTO, essi possono anche essere soluzioni idiomatiche per quelle poche volte in cui sono necessari nel codice T-SQL per motivi di chiarezza questi particolare (cattivi) costrutti di loop.

Usa questi a propria discrezione, cercando di non subire l'ira dei vostri sviluppatori compagni quando catturano si utilizza il tanto diffamato GOTO.

Mi sembra di ricordare la lettura di questo articolo più di una volta, e la risposta è solo close per quello che mi serve.

Di solito, quando penso che ho intenzione di bisogno di un DO WHILE in T-SQL è perché sto iterazione un cursore, e sto cercando in gran parte per una chiarezza ottimale (vs. velocità ottimale). In T-SQL che sembra montare un WHILE TRUE / IF BREAK.

Se questo è lo scenario che ti ha portato qui, questo frammento può risparmiare un momento. In caso contrario, bentornato, me. Ora posso essere certo io sono stato qui più di una volta. :)

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

Purtroppo, T-SQL non sembra offrire un modo più pulito per singolarmente-definire l'operazione ad anello, che questo ciclo infinito.

È anche possibile utilizzare una variabile di uscita se si desidera che il codice per essere un po 'più leggibile:

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

Questo sarebbe probabilmente più rilevante quando si ha un ciclo più complicata e sta cercando di tenere traccia della logica. Come i cicli indicati sono costosi, quindi cercare di utilizzare altri metodi, se possibile.

Solo While Loop è ufficialmente supportato da SQL server. Già c'è risposta per DO ciclo while. Sto Detailing risposta su modi per ottenere diversi tipi di cicli in SQL Server.

Se si conosce, è necessario completare prima iterazione del ciclo in ogni caso, allora si può provare do..while o REPEAT..UNTIL versione del server SQL.

do..while Loop

DECLARE @X INT=1;

WAY:  --> Here the  DO statement

  PRINT @X;

  SET @X += 1;

IF @X<=10 GOTO WAY;

REPEAT..UNTIL Loop

DECLARE @X INT = 1;

WAY:  -- Here the REPEAT statement

  PRINT @X;

  SET @X += 1;

IFNOT(@X > 10) GOTO WAY;

PER Loop

DECLARE @cnt INT = 0;

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

PRINT 'Done FOR LOOP';

Riferimento

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top