#sql-server #stored-procedures #ssis #cursors
#sql-сервер #хранимые процедуры #ssis #курсоры
Вопрос:
У меня есть хранимая процедура, которую я пытаюсь выполнить в SSIS с помощью Execute SQL Task . Эта хранимая процедура включает курсор, и последний шаг — удаление курсора. Я наблюдаю, что даже после завершения выполнения хранимой процедуры Выполнение задачи SQL не завершается и надолго останавливается, прежде чем перейти к следующему шагу. Чтобы проверить это, я добавил insert stmt в качестве последней строки в хранимой процедуре с GETDATE() в качестве значения одного столбца. Это показывает, что выполнение STP завершено почти за 2 часа до завершения выполнения задачи SQL. Есть идеи, выполняет ли задача Execute SQL некоторые дополнительные шаги вместе с требуемой хранимой процедурой
Комментарии:
1. Почему вы предполагаете, что служба SSIS или задача Execute SQL являются неисправными? Использование курсоров — это очень сильный запах — существует очень, очень, очень мало вещей, требующих курсора. Единственный допустимый сценарий, пакетная обработка, адресуется SSIS datalfow. Скорее всего, ваша хранимая процедура не завершается, когда вы думаете, что это так, потому что для завершения курсора требуется гораздо больше времени, чем для выполнения эквивалентной инструкции SQL. В худшем случае использование курсора приводит к блокировке всей таблицы на несколько часов, что приводит к блокировке с другими операторами
2. Можете ли вы опубликовать свой код или рассказать нам, что вы пытаетесь сделать. Это даст нам лучшее представление о том, что происходит, и, возможно, найдет лучшее решение.
3. Также обратите внимание на запуск профилировщика, а не просто на использование инструкции insert в конце SP>
4. @panagiotis: 🙂 я не рассматриваю здесь какую-либо проблему, просто пытаюсь определить, что происходит после последней строки кода. Мой сценарий использования курсора выглядит следующим образом: у меня есть, скажем, 10 записей, каждая из которых должна проходить через различный набор правил для проверки правильности. Это заставляет меня просматривать по одной записи за раз, следовательно, курсор. Я использовал подсказку для блокировки уровня строки в таблице, поэтому я предполагаю, что она не будет блокировать всю таблицу целиком. Буду рад узнать, есть ли у вас какой-нибудь лучший способ решить эту проблему. спасибо за вашу помощь
5. Невозможно ответить без самих запросов . В любом случае, даже для этого вам не нужен курсор. Вы можете запустить 1 запрос для каждого правила, зная, что оптимизатор обойдет его стороной. Вы могли бы преобразовать правила в функции и просто объединить их с данными. Или же вы могли бы создать таблицу истинности, содержащую записи для всех правил, и объединить их с данными
Ответ №1:
Решено 🙂 это было в основном потому, что я использовал несколько операторов печати в хранимых процедурах SQL, и когда я выполнял эти хранимые процедуры из SSIS, это могло создавать некоторые буферы, которые очищались после выполнения. Я прокомментировал печать stmts в моей сохраненной процедуре, и время выполнения в SSIS совпадает со временем выполнения в SSMS.
Спасибо, что уделили мне время и помогли мне.
С уважением