2014-12-16 2 views
0

У меня есть курсор, который работает, но пропускает каждую другую запись. Моя выборка рядом выглядит как этоткурсор пропускает каждую строку

OPEN DemandCur 
While 1 = 1 
BEGIN 

    FETCH NEXT FROM DemandCur INTO 
    @----, 
    @+++++ 

    select @index = (select demand from TechCoDemand where Date = '2014-11-30') 

    IF @index <= 0 BREAK; 

    IF @@FETCH_STATUS <> 0 BREAK; 

    FETCH NEXT FROM DemandCur INTO 
    @---, 
    @++++ 
End 

Close DemandCur 
Deallocate DemandCur 

Я изменил его

FETCH NEXT 

И она перестала пропускать записи, но я получаю сообщение об ошибке после того, как запрос делается:

Msg 16916, Уровень 16, состояние 1, строка 121
Курсор с именем «NEXT» не существует.

+0

Это худшие имена переменных, которые я видел – DLeh

+0

DLeh, Это не настоящие имена переменных. – user2220670

+0

, что является рельефом – DLeh

ответ

0

Как уже упоминалось в предыдущих комментариях, вы выборки в два раза в течение вашего цикла. Хотя (ха!) Вам нужно «заправлять насос» (так сказать), выбирая одну строку за пределами цикла while, вот идиома, которую я люблю использовать, чтобы полностью избежать этого.

declare cursor foobar for 
select ... 

open foobar 

while(1=1) 
begin 

    fetch next from foobar into ... 
    if (@@fetch_status <> 0) 
     break 

    --process results 

end 

close foobar 
deallocate foobar 

Это имеет преимущество только того, чтобы иметь один принести заявление сохранить, но, более уместны к этому разговору, избегает своей ошибки полностью.

+0

Спасибо, Бен Тул. Это сработало отлично. У меня создалось впечатление, что вам всегда нужно иметь второе предложение из всех кодов, которые я видел. – user2220670

0

Изменить код на это ....

OPEN DemandCur 
FETCH NEXT FROM DemandCur INTO @----, @+++++ 
While @@FETCH_STATUS = 0 
BEGIN 
    select @index = (select demand from TechCoDemand where Date = '2014-11-30') 
    IF @index <= 0 BREAK; 
    FETCH NEXT FROM DemandCur INTO @---, @++++ 
END 

Close DemandCur 
Deallocate DemandCur 
Смежные вопросы