Fare ciclo while in SQL Server 2008
-
11-10-2019 - |
Domanda
Esiste un metodo per implementare ciclo do while
in SQL Server 2008?
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 /
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
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
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 ??em> 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';