2009-07-24 9 views
6

Ho un cursore SQL Server. Voglio saltare un'iterazione del ciclo quando si verifica una condizione specifica. Break ti porta fuori dal loop del cursore e continua a non sembrare fare nulla.SQL Server Come si fa a ripetere un ciclo del cursore una volta che si verifica una condizione specifica

C'è un comando che dice "hey questo record non va bene, quindi lascia andare avanti e salta e lavora al prossimo".

A proposito, so che i cursori sono malvagi come i piloti che vanno 43 MPH nella corsia di sorpasso, ma come spesso accade nel software sono bloccato con esso.

Grazie

risposta

7

Perché don' t è sufficiente utilizzare un'istruzione if:

IF condition exists that I want to update THEN 
BEGIN 

.... 

END 

Fetch Next 
+1

Grazie questa è la risposta corretta. – codingguy3000

0

potrebbe essere più facile per rispondere a questa se sapevamo quello che il codice del cursore sembrava. Forse puoi inserire una dichiarazione if che controlla la condizione e fa qualcosa solo se la condizione non è presente.

9

se si codifica il ciclo con il recupero in basso (con il recupero iniziale prima del ciclo) continua si salterà in cima e si elaborerà nuovamente la stessa riga. è possibile utilizzare un GOTO per saltare alla parte di recupero in basso o ristrutturare il ciclo per recuperare in alto e il cointinue funzionerà.

è possibile modificare il ciclo di usare GOTO ...

... 
... 
if <condition> 
BEGIN 
    GOTO Fetch_Next 
END 
.... 
.... 
Fetch_Next: 
FETCH NEXT FROM ... 

Ecco alcuni esempi di codice per un solo recuperare in cima alla ciclo, continua funzionerà:

DECLARE <cursor_name> CURSOR FOR 
    SELECT 
    FROM 
    WHERE 
    FOR READ ONLY 

--populate and allocate resources to the cursor 
OPEN <cursor_name> 

--process each row 
WHILE 1=1 
BEGIN 

    FETCH NEXT FROM <cursor_name> 
     INTO @a, @b, @c 

    --finished fetching all rows? 
    IF @@FETCH_STATUS <> 0 
    BEGIN --YES, all done fetching 
     --exit the loop 
     BREAK 
    END --IF finished fetching 

    --do something here-- 
    --do something here-- 

    IF <your condition> 
    BEGIN 
     CONTINUE -- fetch next row 
    END 

    --do something here-- 
    --do something here-- 

END --WHILE 

--close and free the cursor's resources 
CLOSE <cursor_name> 
DEALLOCATE <cursor_name> 
+0

Il Goto Statment ha aiutato molto. Grazie. –

0

La risposta a buon mercato è quello di inserire un blocco IF: inizio ciclo/IF fila è buono BEGIN ... END/fine ciclo.

0

Non ho mai trovato un cursore SQL non riesco a rimuovere con un pensierino, e i guadagni in termini di prestazioni sono in genere enormi. C'è un motivo per cui non puoi selezionare solo le righe su cui vuoi operare, piuttosto che eseguire l'elaborazione riga per riga?

Problemi correlati