Добавление данных в Raw File Destination внутри ForEach Loop контейнера

В продолжение темы об использовании ADO.NET коннектора в сочетании с For Each Loop контейнером.

В качестве полезной нагрузки такого решения скорей всего будет выступать Data Flow Task, в котором будут забираться данные из какого-либо листа Excel, обрабатываться, включая использование агрегаций, и загружаться в некую таблицу в базе.

Беда в том, что так как в Data Flow будет обрабатываться один лист за раз, то и агрегации будут накладываться на данные текущего листа. А что делать, если в таблицу нужно заливать исключительно агрегированные данные и создавать вспомогательные таблицы тоже нельзя?

Сразу на ум приходит вопрос. Почему разработчики SSIS сделали Rowset Destination, но не сделали Rowset Source?

В сети можно найти решения на базе Script Task’ов, позволяющие работать с Rowset’ами (например, здесь), можно даже извернуться и использовать объект, в котором содержится rowset, в связке с For Each Loop контейнером.

Но есть более правильное и более быстрое решение – использование Raw файлов.

Raw файл формируется средствами SSIS с помощью Raw File Destination. В нем данные хранятся в двоичном виде, плюс этот файл содержит также информацию о структуре данных и атрибутах столбцов, поэтому он не требует дополнительной обработки и обеспечивает высокую скорость работы.

Разработчики SSIS позиционируют RAW файлы, как способ передачи данных между различными Data Flow Task’ами.

А вот в режимах работы коннектора с RAW файлом кроется подстава подстав. Как видно из скриншота есть 4 режима работы с файлом, но нет ни одного режима который бы однократно создавал файл, а потом добавлял бы туда новые данные.

Поэтому когда Rowset Destination используется внутри For Each Loop контейнера, файл данных будет либо перезаписываться, либо новые данные будут добавляться к старым, что не правильно и не изящно.

Решить проблему, можно создав два Data Flow Task’a, в одном использовать RAW File Destination в режиме ‘Create Always’, в другом – ‘Append’. А принятие решения – какое Data flow исполнять принимать на основе счетчика.

Script Task накручивает счетчик при каждой итерации контейнера. Если значение счетчика 1, то запускается левое workflow, создается RAW файл и в него загружается часть данных с первого листа. При всех прочих значениях счетчика запускается второе workflow, в котором данные добавляются.

По окончании работы компонента можно запустить Data Flow с Raw File Source, чтобы забрать все данные, провести необходимые агрегации и загрузить их в базу.

Ссылки:

RAW File Destination on Technet: http://technet.microsoft.com/en-us/library/ms141661.aspx

Сравнение скорости работы RAW файлов и Script Task’ов: http://consultingblogs.emc.com/jamiethomson/archive/2006/06/28/SSIS_3A00_-Comparing-performance-of-a-raw-file-against-a-recordset-destination.aspx

Запись опубликована в рубрике Business Intelligence, Tips and Tricks с метками . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *