2009-10-03 13 views
28

Sto cercando di capire come implementare questa in TSQLCome implementare un ciclo do-while in TSQL

do 
    update stuff set col = 'blah' where that_row = 'the right one' 
    select trash from stuff ... 
until some_condition 

L'unica frase flusso di controllo iterativo fornito da Transact-SQL è while (condition) sentences che prima valuta la condizione e se questa condizione è vera, esegui la frase.

Sto pensando in uno scenario come eseguire un'istruzione UPDATE su una tabella finché non viene raggiunta una condizione che ha attivato l'ultimo UPDATE eseguito.

cosa più importante, sto cercando un approccio meno sporca a questo problema (Duplicare l'aggiornamento prima WHILE non ha molto senso per me come la frase UPDATE può essere arbitrariamente lungo e complesso)


EDIT: Il problema che sto cercando di risolvere riguarda più istruzioni UPDATE sotto la stessa tabella, ognuna delle quali prende e trasforma i valori dalle iterazioni precedenti. Questo non è possibile fare in una sola grande istruzione UPDATE, poiché ogni riga verrà valutata e aggiornata solo una volta, quindi un ciclo è l'unico modo che posso capire per far funzionare questo pasticcio.

+4

Se stai pensando al controllo del flusso per il codice del database, stai sbagliando. –

+4

Non essere così inflessibile, a volte la logica aziendale deve essere sviluppata nelle stored procedure. – Rodrigo

+0

@rodrigo, he isn: parlando di un processo memorizzato, sta parlando dell'uso della teoria degli insiemi e non del tutto. È possibile evitare il ciclo circa il 99% del tempo ed è SEMPRE preferibile farlo se è possibile. – HLGEM

risposta

39

Questo è effettivamente un ciclo Do-While:

WHILE (1=1) 
    BEGIN 

    -- Do stuff... 

    IF (some_condition is true) 
    BREAK; 

    END 

Ma, come ha osservato @ Joel Coehoorn, cerca sempre di usare un approccio basato set prima. Mi piacerebbe solo ricorrere a un loop se non riesco a pensare a un modo per risolvere usando le operazioni set.

+1

1 non è un valore booleano, invece di questo (1 = 1) può fare il lavoro. Questa soluzione funziona ed è molto semplice. Sembra ovvio dopo aver letto! Molte grazie. – Rodrigo

+1

@Rodrigo: hanno aggiornato. Grazie. –

+8

Funzionerà, ma man se scrivere "1 = 1" non è deprimente nel codice di produzione ... –