2009-07-24 2 views
6

Ich habe einen SQL Server-Cursor. Ich möchte eine Iteration der Schleife überspringen, wenn eine bestimmte Bedingung auftritt. Pause bringt Sie aus der Cursor-Schleife und fortfahren scheint nichts zu tun.SQL Server Wie wiederhole ich eine Cursorschleife einmal, wenn eine bestimmte Bedingung auftritt

Gibt es einen Befehl, der sagt „hey diese Platte nicht gut, so lassen Sie voran gehen und es überspringen und auf die nächste Arbeit“.

Durch die Art, wie ich weiß, Cursor wie Treiber böse sind, die 43 MPH auf der Überholspur gehen, aber wie so oft in Software, die ich bin mit ihm stecken.

Dank

Antwort

7

Warum don‘ t Sie nur eine if-Anweisung verwenden:

IF condition exists that I want to update THEN 
BEGIN 

.... 

END 

Fetch Next 
+1

Danke das ist die richtige Antwort. – codingguy3000

0

Es könnte einfacher sein, diese zu beantworten, wenn wir das, was sich der Cursor Code wusste aussah. Vielleicht können Sie eine if-Anweisung einfügen, die nach der Bedingung sucht und nur etwas tut, wenn die Bedingung nicht vorhanden ist.

9

, wenn Sie Ihre Schleife mit dem Abruf am Boden (mit dem anfänglichen holen vor der Schleife) codieren weiterhin werden Sie nur nach oben springen und wieder die gleichen Zeile verarbeiten. Sie könnten ein GOTO verwenden, um zum Fetch-Teil am unteren Rand zu springen oder den Loop neu zu strukturieren, um ihn oben zu holen, und der Cointinue funktioniert.

Sie Ihre Schleife GOTO verwenden ändern könnten ...

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

Hier sind einige Codebeispiele eines für nur an der Spitze der Schleife holen, weiter arbeiten:

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

Die Goto-Anweisung hat sehr geholfen. Vielen Dank. –

0

Die günstige Antwort ist ein IF-Block einzufügen: beginnen Schleife/IF Reihe gut bEGIN ... ENDE/Endschleife.

0

Ich habe noch nie einen SQL-Cursor gefunden, den ich nicht mit ein wenig Nachdenken entfernen konnte, und die Leistungsgewinne sind normalerweise riesig. Gibt es einen Grund, warum Sie nicht nur die Zeilen auswählen können, die Sie bearbeiten möchten, statt die zeilenweise Verarbeitung durchzuführen?

Verwandte Themen