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