как избежать выполнения оператора курсора, если записи не возвращаются - PullRequest
0 голосов
/ 13 апреля 2011

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

Курсор выполняет оператор вставки.

Я ожидаю, что оператор вставки не будет выполнен, если запрос вернется0 записей.Но это все равно выполняется.Не могли бы вы предложить способ избежать этого?

    declare  nested_cursor CURSOR 
    FOR 
    SELECT MyRECORD 

    FROM MyTable
    WHERE MyRECORD = @ID -- @ID is a variable defined in the main cursor
    -- for some values of @iD ht above select statement may return zero records
    OPEN nested_cursor
    FETCH NEXT FROM nested_cursor INTO @NestedID
    WHILE (@@fetch_status = 0)
    BEGIN  


        INSERT STATEMENT  -- HERE I HAVE THE PROBLEM , why this executes?                 
        FETCH NEXT FROM nested_cursor INTO @NestedID
    END
    CLOSE nested_cursor
    DEALLOCATE nested_cursor

ОБНОВЛЕНИЕ: я нашел обходной путь, проверив, имеет ли значение @NestedId значение NULL непосредственно перед оператором INSERT.добавить эту проверку в

WHILE (@@fetch_status = 0) and (@NestedID is not null)

или есть лучшая техника?

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

Я добавил комментарий, но переделаю выбор в ответе, чтобы я мог использовать форматирование кода, чтобы сделать его более понятным.

1 голос
/ 13 апреля 2011

Это должно работать так, как вы показали.И как уже говорили другие, курсор кажется ненужным.

Вы можете попробовать проверить @@ CURSOR_ROWS после вашего оператора OPEN.В качестве альтернативы, возможно, он возвращает строки, но неожиданно столбец MyRecord имеет значение null или какое-то другое неожиданное значение?

...