2009-07-24 13 views
6

Mam kursor programu SQL Server. Chcę pominąć jedną iterację pętli, gdy wystąpi określony warunek. Break wyjmuje cię z pętli kursora i kontynuowanie nie wydaje się nic robić.Serwer SQL Sposób iterowania po pętli kursora w przypadku wystąpienia określonego warunku

Czy istnieje polecenie, które mówi "hej ta płyta nie jest dobra, więc pozwól jej iść dalej i pomiń to i pracuj nad następnym".

Przy okazji wiem, że kursory są złe jak kierowcy, którzy pokonują 43 mph na mijanym pasie, ale jak to często bywa w oprogramowaniu, utknąłem z tym.

Dzięki

Odpowiedz

7

Dlaczego don” t po prostu użyć instrukcji if:

IF condition exists that I want to update THEN 
BEGIN 

.... 

END 

Fetch Next 
+1

Dziękuję, że to jest poprawna odpowiedź. – codingguy3000

0

może łatwiej będzie odpowiedzieć na to pytanie, gdybyśmy wiedzieli, co kod kursor wyglądał. Być może możesz wstawić instrukcję if, która sprawdza warunek i robi tylko coś, jeśli warunek nie jest obecny.

9

jeśli zakodujesz pętlę z pobieraniem na dole (przy początkowym pobraniu przed pętlą) kontynuuj, po prostu przeskoczę do góry i przetworzysz ten sam wiersz ponownie. możesz użyć GOTO, aby przeskoczyć do części pobierania na dole lub przebudować pętlę, aby pobrać u góry i cointinue będzie działać.

można zmodyfikować pętlę do korzystania GOTO ...

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

Oto przykładowy kod dla jedynego zwrcania na szczycie pętli, nadal będzie działać:

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

Goto Statment bardzo pomogło. Dziękuję Ci. –

0

Tania odpowiedź polega na wstawieniu bloku IF: początek pętli/IF rząd jest dobry BEGIN ... END/koniec pętli.

0

Nigdy nie znalazłem kursora SQL, którego nie mógłbym usunąć z małą myślą, a przyrost wydajności jest zwykle ogromny. Czy istnieje powód, dla którego nie można wybrać tylko wierszy, na których chcesz operować, zamiast wykonywać przetwarzanie wiersz po wierszu?

Powiązane problemy