Возможно, вы уже нашли решение. Я надеюсь, что это может помочь кому-то найти решение этой проблемы.
Нет встроенной настройки задачи потока данных, доступной в SSIS для этого. Для этого можно использовать преобразование Row Count
внутри задачи «Поток данных» в сочетании с File System Task
в потоке управления.
Вот пошаговый процесс, как это сделать. В этом примере я использовал файл csv с именем Country_State.csv
, содержащий страны и государства в качестве исходного файла.
Сценарий
Пример пакета прочитает файл, а затем запишет в текстовый файл с именем Destination.txt
. В этом случае файл ошибок Error.txt
будет создан, но позже будет удален, если ошибок нет. Здесь у меня есть файлы, хранящиеся в пути c:\temp\
Шаг за шагом:
- В разделе диспетчера соединений создайте три соединения с плоскими файлами, а именно: Источник , Адресат и Ошибка . Смотрите скриншот # 1 .
Source
соединение должно указывать на путь к файлу CSV c:\temp\Country_State.csv
. См. Скриншот # 2 для содержимого этого файла.
Destination
соединение должно указывать на текстовый файл с именем c:\temp\Destination.txt
.
Error
соединение должно указывать на текстовый файл с именем c:\temp\Error.txt
.
- Создать переменную типа данных Int32 с именем
ErrorCount
.
- На вкладке Поток управления поместите
Data Flow Task
, а затем поместите File System Task
.
- Подключите задачу потока данных к задаче файловой системы.
- Щелкните правой кнопкой мыши соединитель между задачей потока данных и задачей файловой системы.
- В Редакторе ограничений предшествования измените Оценочную операцию на
Expression
и вставьте значение @ErrorCount == 0
в текстовое поле Выражение .
- Ваш поток управления должен выглядеть так, как показано на скриншоте # 3 .
- Внутри задачи потока данных на вкладке «Поток данных» перетащите источник плоских файлов и настройте его для использования
Source
диспетчера соединений.
- Поместите пункт назначения плоского файла и настройте его для использования
Destination
диспетчера соединений.
- Подключите зеленую выходную стрелку из источника плоских файлов к назначению плоских файлов.
- Поместите преобразование
Row Count
на вкладку потока данных и настройте его для использования переменной User:ErrorCount
.
- Соедините красную выходную стрелку из источника плоских файлов с преобразованием количества строк.
- Поместите пункт назначения плоского файла и настройте его для использования
Error
диспетчера соединений.
- Подключите выход из числа строк к назначению плоского файла, используя соединение
Error
.
- Ваша задача потока данных должна выглядеть так, как показано на скриншоте # 4 .
- На вкладке «Поток управления» дважды щелкните «Задача файловой системы».
- В редакторе задач файловой системы установите Operation на
Delete file
и установите SourceConnection на Error
. Смотрите скриншот # 5 .
- Содержимое пути к папке
C:\temp
перед выполнением пакета показано на скриншоте # 6 .
- Выполнение вкладки потока данных показано на скриншоте # 7 .
- Выполнение потока управления показано на скриншоте # 8 .
- Содержимое пути к папке
C:\temp
после выполнения пакета показано на скриншоте # 9 .
- Чтобы показать, что это действительно работает, я изменил второй столбец в диспетчере соединений
Source
на целое число (даже если имена состояний - строки), чтобы задача потока данных перенаправлялась на вывод Error
.
- Сценарий 2 Выполнение вкладки потока данных показано на скриншоте # 10 .
- Сценарий 2 Выполнение потока управления показано на скриншоте # 11 . Обратите внимание, что задача файловой системы не выполняется, поскольку файл ошибок не пуст.
- Содержимое пути к папке
C:\temp
после сценария 2 Выполнение пакета показано на скриншоте # 12 . Обратите внимание, что файл Destination.txt присутствует, хотя не было успешных строк. Это связано с тем, что в примере удаляется только файл ошибок, если он пустой.
Аналогичная логика может быть использована для удаления пустого файла назначения.
Надеюсь, это поможет.
Снимок экрана № 1:
Скриншот № 2:
Скриншот № 3:
Снимок экрана № 4:
Скриншот № 5:
Снимок экрана № 6:
Снимок экрана № 7:
Снимок экрана № 8:
Снимок экрана № 9:
Снимок экрана № 10:
Скриншот № 11:
Снимок экрана № 12: