Не создавать файл, когда источник имеет 0 строк

У меня есть ниже в области потока данных. Проблема, с которой я сталкиваюсь, заключается в том, что даже если результат равен 0, он все равно создает файл.

Кто-нибудь может увидеть, что я здесь делаю не так?

https://s tackru.com/images/30028e72d830528ed5f560d4edaebf8d222b1a44.png

https://s tackru.com/images/fb50b5c8f84beff87a3906d4ae1d62410dbe333c.png

https://s tackru.com/images/995e293f94ecd2c73b8bf6cbba30d00b186cc992.png

2 ответа

Решение

Это довольно ожидаемое и известное раздражающее поведение. Служба SSIS создаст пустой плоский файл, даже если он не отмечен: "имена столбцов в первой строке данных".

Обходные пути:

  • удалить такой файл задачей файловой системы, если @RowCountWriteOff = 0 только после выполнения потока данных.

  • в качестве альтернативы, не запускайте поток данных, если ожидаемое количество строк в источнике равно 0:


Обновление 2019-02-11:

У меня есть проблема, что у меня есть 13 из этих команд экспорта в CSV в потоке данных, и это дорогостоящие запросы

  • Тогда двойной запрос источника для проверки количества строк будет еще дороже и, возможно, лучше будет повторно использовать значение переменной @RowCountWriteOff.
  • Первоначальный проект имеет 13 потоков данных, добавляя 13 ограничений и 13 задач файловой системы, основной поток управления сделает пакет более сложным и сложным в обслуживании
  • Таким образом, предложение заключается в использовании OnPostExecute обработчик событий, поэтому логика очистки изолирована от некоторого определенного потока данных:

Обновление 1 - добавление более подробной информации на основе комментариев OP

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

  1. Сначала вы должны создать контейнер цикла по каждому элементу для циклического перемещения по таблицам.
  2. Вы должны добавить Execute SQL Task с командой подсчета SELECT COunt(*) FROM ....) и сохранить Resultset внутри переменной
  3. Добавьте задачу потока данных, которая импортирует данные из источника OLEDB в место назначения плоского файла.
  4. После этого вы должны добавить ограничение приоритета с выражением в задачу потока данных с выражением, аналогичным @[User::RowCount] > 0

Кроме того, полезно проверить предоставленные мной ссылки, поскольку они содержат много полезной информации и пошаговые руководства.


Начальный ответ

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

  1. Попробуйте установить Data Flow TaskDelay Validation собственность на True
  2. Создать другой Data Flow Task внутри пакета, который будет использоваться только для подсчета строк в источнике, если он больше, чем 0 тогда ограничение приоритета должно привести к другому Data Flow Task
  3. Добавить File System Task после Data Flow Task которые удаляют выходной файл, если RowCount o, вы должны установить выражение ограничения приоритета, чтобы убедиться, что.

Рекомендации и полезные ссылки

Другие вопросы по тегам