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

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

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


person Simon D    schedule 29.01.2009    source источник


Ответы (9)


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

person Rob    schedule 29.01.2009

Вот один из возможных вариантов. Вы можете выполнить требования, упомянутые в вопросе, изменив 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:

1

Снимок экрана № 2:

2

Снимок экрана № 3:

3

Снимок экрана №4:

4

Снимок экрана 5:

5

Снимок экрана № 6:

6

Снимок экрана № 7:

7

Снимок экрана № 8:

8

person Community    schedule 16.07.2011
comment
Что делать, если в моем пакете уже есть Drop Table, Prepare SQL Table и задача потока данных. Как меняются настройки? - person Si8; 15.04.2014

Проверьте свойства FailPackageOnFailure и FailParentOnFailure задачи FileSystem и убедитесь, что для них установлено значение False. Также увеличьте свойство MaximumErrorCount пакета.

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

person Rob Boek    schedule 03.02.2009
comment
FailPackageOnFailure и FailParentOnFailure ложны. (Как я уже упоминал в своем вопросе) я могу увеличить MaximumErrorCount, но это будет означать, что другие ошибки в другом месте пакета останутся незамеченными. Похоже, выбор такой: слабая проверка ошибок при отсутствии задачи FS. - person Simon D; 04.02.2009
comment
Если у вас есть другие важные элементы, вы можете установить для FailPackageOnFailure значение True для этих элементов. Тогда пакет выйдет из строя даже с увеличенным MaximumErrorCount. Вы также можете добавить задачи обработки ошибок, чтобы определить погоду, вывести пакет из строя или нет, на основе ошибки. - person Rob Boek; 06.02.2009

Сделайте свойство «Принудительный результат выполнения» успешным для задачи Файловая система.

person Vikram Shankar    schedule 06.04.2013

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

person user24531    schedule 30.01.2009
comment
Спасибо за предложение - я попытался использовать контейнер последовательности, но тот факт, что в потоке произошла ошибка, означает, что пакет достигает своего значения MaximumErrorCount и не работает. Думаю, Роб прав - это невозможно сделать, что делает задачу файловой системы довольно хрупкой. - person Simon D; 30.01.2009

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

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

person user46795    schedule 06.02.2009

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

С уважением

person Community    schedule 05.04.2009

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

person Community    schedule 14.10.2009

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

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

Дополнительную информацию см. В ответе на этот вопрос cfrag. Этот ответ указывает на эту запись в блоге в котором объясняется, как установить переменную распространения для обработчика события OnError (сделать обработчик событий, открыть представление переменных, показать системные переменные, установить для Propogate значение false).

person Jeff    schedule 17.05.2013