Esiste un metodo per implementare il do while
loop in SQL Server 2008?
Esiste un metodo per implementare il do while
loop in SQL Server 2008?
Risposte:
Non sono sicuro di DO-WHILE IN MS SQL Server 2008 ma puoi cambiare la logica del tuo ciclo WHILE, in modo da USARE come il ciclo DO-WHILE.
Gli esempi sono presi da qui: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of-while-loop-with-continue-and-break-keywords/
Esempio di WHILE Loop
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 parola chiave 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
Esempio di ciclo WHILE con le parole chiave CONTINUE e 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
Ma cerca di evitare loop a livello di database. Riferimento .
Se non sei molto offeso dalla GOTO
parola chiave, può essere utilizzata per simulare un DO
/ WHILE
in T-SQL. Considera il seguente esempio piuttosto privo di senso scritto in pseudocodice:
SET I=1
DO
PRINT I
SET I=I+1
WHILE I<=10
Ecco il codice T-SQL equivalente che utilizza goto:
DECLARE @I INT=1;
START: -- DO
PRINT @I;
SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10
Notare la mappatura uno a uno tra la GOTO
soluzione abilitata e l'originale DO
/ WHILE
pseudocodice. Un'implementazione simile che utilizza un WHILE
ciclo sarebbe simile a:
DECLARE @I INT=1;
WHILE (1=1) -- DO
BEGIN
PRINT @I;
SET @I+=1;
IF NOT (@I<=10) BREAK; -- WHILE @I<=10
END
Ora, potresti ovviamente riscrivere questo particolare esempio come un semplice WHILE
ciclo, poiché questo non è un buon candidato per un costrutto DO
/ WHILE
. L'enfasi era sulla brevità dell'esempio piuttosto che sull'applicabilità, poiché i casi legittimi che richiedono una DO
/ WHILE
sono rari.
REPEAT / UNTIL, chiunque (NON funziona in T-SQL)?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
... e la GOTO
soluzione basata 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 GOTO
e l'inversione logica tramite la NOT
parola chiave, esiste una relazione molto stretta tra lo pseudocodice originale e la GOTO
soluzione basata. Una soluzione simile che utilizza un WHILE
ciclo ha il seguente aspetto:
DECLARE @I INT=1;
WHILE (1=1) -- REPEAT
BEGIN
PRINT @I;
SET @I+=1;
IF @I>10 BREAK; -- UNTIL @I>10
END
Si può argomentare che per il caso della REPEAT
/ UNTIL
, laWHILE
soluzione basata è più semplice, perché la condizione if non è invertita. D'altra parte è anche più prolisso.
Se non fosse per tutto il disprezzo sull'uso di GOTO
, queste potrebbero anche essere soluzioni idiomatiche per quelle poche volte in cui questi particolari costrutti (malvagi) di loop sono necessari nel codice T-SQL per motivi di chiarezza.
Usali a tua discrezione, cercando di non subire l'ira dei tuoi colleghi sviluppatori quando ti sorprendono a usare il tanto diffamato GOTO
.
Mi sembra di ricordare di aver letto questo articolo più di una volta e la risposta è vicina a ciò di cui ho bisogno.
Di solito quando penso che avrò bisogno di un DO WHILE
in T-SQL è perché sto iterando un cursore e cerco in gran parte una chiarezza ottimale (rispetto alla velocità ottimale). In T-SQL che sembra adattarsi a WHILE TRUE
/ IF BREAK
.
Se questo è lo scenario che ti ha portato qui, questo frammento potrebbe farti risparmiare un momento. Altrimenti, bentornato, me. Ora posso essere certo di essere 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
Sfortunatamente, T-SQL non sembra offrire un modo più pulito per definire singolarmente l'operazione di ciclo rispetto a questo ciclo infinito.
Puoi anche usare una variabile di uscita se vuoi che il tuo codice sia 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 hai un ciclo più complicato e stai cercando di tenere traccia della logica. Come affermato, i loop sono costosi, quindi cerca di utilizzare altri metodi se puoi.
Solo While Loop è ufficialmente supportato dal server SQL. C'è già una risposta per DO while loop. Sto descrivendo in dettaglio la risposta sui modi per ottenere diversi tipi di loop nel server SQL.
Se lo sai, devi comunque completare la prima iterazione del ciclo, quindi puoi provare DO..WHILE o REPEAT..UNTIL versione di SQL server.
DECLARE @X INT=1;
WAY: --> Here the DO statement
PRINT @X;
SET @X += 1;
IF @X<=10 GOTO WAY;
DECLARE @X INT = 1;
WAY: -- Here the REPEAT statement
PRINT @X;
SET @X += 1;
IFNOT(@X > 10) GOTO WAY;
DECLARE @cnt INT = 0;
WHILE @cnt < 10
BEGIN
PRINT 'Inside FOR LOOP';
SET @cnt = @cnt + 1;
END;
PRINT 'Done FOR LOOP';