Обработка нескольких курсоров в хранимой процедуре - PullRequest
0 голосов
/ 06 марта 2012

У меня есть два курсора (скажем, CRSX1, CRSX2) в хранимой процедуре.Это как вложенная логика цикла while, которую я должен реализоватьМогу ли я использовать второй курсор CRSX2, когда CRSX1 открыт, или мне нужно закрыть первый курсор перед использованием второго курсора.

Или есть ли другой способ, если нам нужно реализовать логику для двойного цикла while в SQLСервер

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 06 марта 2012

Вы можете вкладывать курсоры, но вы должны стремиться удалить эти курсоры в пользу операции на основе SET, если можете. В противном случае, скорее всего, производительность не будет большой, особенно при больших объемах данных. Я бы использовал курсоры / цикл только в крайнем случае.

Дополнительные пояснения:
Использование курсоров означает, что вы будете выполнять итерацию раунд за строкой для выполнения определенной операции (RBAR - Row By Agonizing Row). Это не так эффективно, как выполнение операции одним циклическим образом над набором данных за один раз (т.е. на основе набора).

например. грубый пример, чтобы подсчитать количество строк в таблице.

Вариант 1: Неприятный способ RBAR, открыть курсор на столе, выполнить цикл и увеличить переменную счетчика.

Вариант 2: Потрясающий подход на основе множеств, запустите один SELECT, например: SELECT COUNT(*) FROM YourTable

Так что я имею в виду, попытайтесь реорганизовать ваш SQL, чтобы найти подход, основанный на множестве, для достижения желаемого результата. Как правило, очень мало случаев, когда подход с использованием цикла или курсора не может быть заменен подходом, основанным на множестве.

2 голосов
/ 06 марта 2012

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

В образце vendor_cursor содержит product_cursor.

1 голос
/ 06 марта 2012

Вы можете иметь курсоры вложенные , но вам нужно объявить / открыть / извлечь / закрыть / освободить внутренний курсор внутри цикла WHILE внешнего курсора.

...