Управление циклами в DataflowTask в ETL - PullRequest
0 голосов
/ 01 апреля 2010

Будучи довольно новым для SSIS и процесса ETL, мне было интересно, есть ли в любом случае цикл через набор записей в DataFlowTask и передача каждой строки (получение параметров из строки) в хранимую процедуру (следующий шаг Фаза ETL). Как только я передал строку в хранимую процедуру, я хочу, чтобы результаты каждой итерации записывались в таблицу. Кто-нибудь знает, как это сделать?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 01 апреля 2010

Любое преобразование команды OLEDB (которое используется для выполнения команды базы данных) в потоке данных SSIS выполняется один раз для каждой входной строки - что, я думаю, является желаемым поведением. Подробнее здесь .

В вашем сценарии минимальный необходимый вам размер будет:

Data Source -> OLEDB Command -> Data Target

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

1 голос
/ 02 апреля 2010

Будет работать следующая структура:

  1. Создать переменную объекта. (Recordset_object)

  2. Создать строковую переменную. (Record_string)

  3. Создать «Выполнить команду SQL» в потоке управления. Команда должна вернуть набор записей, через который вы хотите выполнить цикл.

  4. В «Выполнить команду SQL» на вкладке «Общие» задайте набор результатов = полный набор результатов.

  5. В «Выполнить команду SQL» на вкладке «Набор результатов» задайте Имя результата = 0 и Имя переменной = (recordset_object).

  6. Создайте «Контейнер цикла по каждому элементу» и создайте ограничение приоритета между «Выполнить команду SQL» и «Контейнер цикла по каждому элементу».

  7. В «контейнере цикла по каждому элементу» на вкладке «Коллекция» задайте перечислитель = перечислитель ADO по каждому элементу.

  8. В «контейнере цикла по каждому элементу» на вкладке «Коллекция» задайте переменную источника объекта ADO = User :: recordset_object.

  9. В «Контейне цикла по каждому элементу» на вкладке «Коллекция» установите режим перечисления = строки в первой таблице.

  10. В «контейнере циклов по каждому элементу» на вкладке «Сопоставления переменных» задайте Variable = User :: record_string и Index = 0.

  11. В «Контейнер цикла по каждому элементу» в области конструирования потока управления добавьте «Выполнить команду SQL».

  12. Для дочерней «Выполнить команду SQL» вы можете (13) установить SQLStatement либо для использования переменной, которая генерирует код, который вы хотите выполнить, либо (14) сопоставление в параметре, либо (15) сделайте record_string командой SQL, которая выполняется кодом.

  13. Если вы используете переменную, то это может быть что-то вроде User :: sql_code_string, а ее значение может быть чем-то вроде "EXEC schema.some_stored_procedure '" + @ [record_string] + "';". Затем вы должны установить SQLSourceType на вкладке «Общие» дочерней «Выполнить команду SQL» = переменную и установить для SQLStatement значение User :: sql_code_string.

  14. Если вы используете параметр, в дочерней «Выполнить команду SQL» в сопоставлении параметров набор вкладок Имя переменной = Пользователь :: запись_строка, Направление = Вход, Тип данных = VARCHAR, Имя параметра = 0, Размер параметра = -1. На вкладке «Общие» дочернего элемента «Выполнить команду SQL» установите для параметра SQLStatement значение «EXEC schema.some_stored_procedure?».

  15. Аналогично 13, но вместо создания отдельной переменной вы можете выполнить User :: record_string. Это может сработать, если содержимое record_string, которое было возвращено вашим набором данных, является запросом, который вы хотите выполнить.

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

Удачи и дайте мне знать, если вам нужны разъяснения по инструкции.

...