Ветвление после задачи файловой системы в SSIS без сбоя пакета - PullRequest
2 голосов
/ 29 января 2009

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

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

Ответы [ 9 ]

10 голосов
/ 16 июля 2011

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

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

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

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

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

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

  5. Щелкните правой кнопкой мыши стрелку ограничения Precedence между 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

2 голосов
/ 03 февраля 2009

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

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

1 голос
/ 06 апреля 2013

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

0 голосов
/ 17 мая 2013

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

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

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

0 голосов
/ 14 октября 2009

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

0 голосов
/ 05 апреля 2009

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

С уважением

0 голосов
/ 06 февраля 2009

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

Успех / Сбой и перенаправление.

0 голосов
/ 30 января 2009

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

0 голосов
/ 29 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...