Ветвление после выполнения задачи файловой системы в службах SSIS без сбоя пакета


Если задача файловой системы, такая как переименование, не выполняется, например, если файл не существует, то SSIS считает это ошибкой. Это означает, что весь пакет выходит из строя. Я могу обойти это, используя задачу сценария или установив максимальное число ошибок для пакета в несколько раз. Проблема с установкой максимальных ошибок для пакета в более чем один заключается в том, что если ошибка происходит где-то в другом месте пакета, пакет не выйдет из строя, когда он должен.

Так есть ли какой-нибудь способ как-то проглотить ошибку и все еще иметь возможность ветвиться на основе успеха или неудачи задачи файловой системы? Я попытался вставить файловую задачу в контейнер последовательности с ForceExecutionResult, установленным на Success, но пакет по-прежнему терпит неудачу, говоря, что максимальное количество ошибок достигнуто.

9 2

9 ответов:

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

Вот один из возможных вариантов. Вы можете выполнить требования, упомянутые в вопросе, изменив Precedence Constraint после задачи файловой системы на Completion. Следующий пример показывает, как это можно сделать. Пример был создан с использованием SSIS 2008 R2 , но остается верным и для предыдущих версий.

Пошаговый процесс:

  1. Создайте пакет служб SSIS и создайте две переменные, как показано на скриншоте #1. Присвойте некоторым несуществующим значениям пути к файлу переменная.

  2. На вкладке поток управления пакета поместите задачу файловой системы, задачу скрипта и задачу потока данных, как показано на скриншоте #2. Задача сценария и задача потока данных здесь фиктивные, и задачи не настроены на выполнение каких-либо действий.

  3. Настройте задачу файловой системы, как показано на скриншоте #3.

  4. Скриншот #4 показывает выполнение пакета и, как и ожидалось, задача файловой системы завершилась неудачно, потому что пути к файлам не существовать. Кроме того, пакет перестал выполнять задачи после задачи файловой системы из-за ошибки.

  5. Щелкните правой кнопкой мыши на Стрелке ограничения приоритета между File System Task и Script Task и выберите завершение , как показано на скриншоте #5. Стрелка должна превратиться из зеленого цвета в синего цвета.

  6. Скриншот #6 показывает выполнение пакета после изменения ограничения приоритета. Задача файловой системы по-прежнему не удалась, но остальные задачи продолжали выполняться. Earlier, условие состояло в том, чтобы выполнить задачу скрипта только в том случае, если задача файловой системывыполнена успешно . Now, условием является выполнение задачи скрипта после завершения выполнения задачи файловой системы (независимо от успеха или неудачи).

  7. Если вы хотите, чтобы пакет принимал полностью два разных пути, основанные на успехе / неудаче. Вы можете сделать это так, как показано на скриншотах #7 и еще #8. Красная стрелка указывает на то, что что путь будет выбран при сбое задачи файловой системы, а зеленая стрелка указывает, что путь будет выбран при успешном выполнении задачи файловой системы. У меня был файл, созданный в пути C:\temp\Source.txt Перед выполнением пакета, показанного на скриншоте #7. После выполнения пакета файл переименовывался, и путь к нему больше не указывался. Следовательно, пакет не удался, как показано на скриншоте #8.

Надеюсь, что помогает.

Скриншот #1:

Один

Скриншот #2:

Два

Скриншот #3:

Три

Скриншот #4:

Четыре

Скриншот #5:

Пять

Скриншот #6:

Шесть

Скриншот #7:

Семь

Скриншот #8:

Восемь

Проверьте свойства FailPackageOnFailure и FailParentOnFailure задачи файловой системы и убедитесь, что они имеют значение False. Кроме того, увеличьте свойство MaximumErrorCount пакета.

Эта комбинация позволит задаче завершиться неудачно, а пакету-успешно.

Сделайте свойство "принудительный результат выполнения" успешным для задачи файловой системы..

Я не пробовал это с задачей FS, но это хорошо работает для потоков данных... Как насчет упаковки задачи файловой системы в контейнер последовательности?.. Если шаг завершается неудачей, контейнер завершается неудачей, вы можете просто вывести данные из контейнера в путь успеха/неудачи....

Вы можете использовать ограничение для соединения. Щелкните правой кнопкой мыши на Стрелке соединения между компонентами SSIS и вы можете указать,

Успех / неудача и перенаправление.

Prashant_sp ответ правильный, вам просто нужно безоговорочно перейти к следующей задаче, выбрав Не ограничение приоритета рабочего процесса "при успешном выполнении", а "перенаправление", которое всегда будет продолжаться, даже если ваша задача FS не выполняется (папка не существует и т. д...)

С уважением

Используйте комбинацию выражений и ограничений на соединителе "ограничение приоритета". всегда возвращайте успех из предыдущей задачи (это может быть скрипт, ищущий файл), и если файл найден, установите переменную. в выражении "ограничение приоритета" проверьте значение переменной и верните true или false. Если ваше выражение принимает значение false, пакет не будет продолжать работу, и все же вы не увидите никаких ошибок. - Маюх

Я знаю, что это старый вопрос, но он может помочь кому-то найти ответ.

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

Смотрите ответ cfrag на этот вопрос для получения дополнительной информации. Этот ответ указывает на эту запись в блоге, которая объясняет, как установить распространение переменная для события onerror обработчик (сделайте обработчик события, открытые переменные посмотреть, показать системные переменные, установить распространение ложных).