Контейнеры
Контейнеры являются базовыми компонентами архитектуры потока управления и объектной модели SSIS. Они помогают логически группировать задачи в отдельные рабочие блоки или создавать сложные условия. Существует четыре типа контейнеров: TaskHost, Sequence, ForLoop, ForEachLoop. Они позволяют:
- Сгруппировать ограничения приоритета так, чтобы группа задач обязательно была успешно (или неуспешно) выполнена перед запуском другой задачи.
- Циклически выполнять последовательность задач до достижения определенного условия.
- Циклически выполнять последовательность задач для каждого элемента какой-либо коллекции.
Контейнер Task Host
Контейнер TaskHost является основным контейнером для единичной задачи. Если не указано для задачи другого контейнера, то она будет помещена в контейнер TaskHost. Архитектура SSIS предоставляет задаче переменные и обработчики событий именно через контейнер TaskHost.
Контейнер Sequence
Ограничения последовательности управляют потоком подмножества пакета и помогают логически поделить пакет на более мелкие управляемые части. Вот примеры того, где можно использовать Sequence контейнер:
- Запретить функциональную область пакета.
- Ограничить область видимости переменных рамками контейнера, а не пакета.
- Повысить управляемость путем задания свойств сразу всему контейнеру вместо задания их для каждой задачи по отдельности.
Контейнер Sequence выглядит точно также как и другие задачи в Controller Flow. После перетаскивания контейнера Sequence из Панели Инструментов, можно поместить в него задачи. На Рисунке 44 показан пример из двух контейнеров. Левый контейнер является контейнером Sequence, который содержит две задачи и должен завершиться успешно для того, чтобы смог запуститься контейнер For Each Loop. Последний контейнер мы сейчас и рассмотрим более подробно.
Рисунок 44
Контейнер For Loop
Контейнер For Loop организует цикл по всем задачам до достижения заданного условия. Например, как показано на Рисунке 45, задача Send Mail выполняется четыре раза. Хотя этот пример может показаться неактуальным, он показывает мощь контейнера For Loop. Данный контейнер может содержать также и другие контейнеры для создания вложенных циклов.
Рисунок 45
Три основных элемента задачи изображены на Рисунке 46. Первый из них это параметр IntExpression, с помощью которого задается начальное значение параметра. Параметр EvalExpression определяет условие, которое служит сигналом механизму выполнения SSIS для выхода из контейнера For Loop. И, наконец, необязательное свойство AssignExpression задает шаг приращения того параметра, что был ранее задан в свойстве InitExpression.
Рисунок 46
Наиболее практичным способом использования данного контейнера является циклическое выполнение задачи WMI Event Watcher или задачи Message Queue для поиска событий. Например, в задаче Message Queue можно ожидать пока группа пакетов другого сервера не зарегистрирует факт завершения работы, чтобы пакет смог продолжить выполнение следующего набора задач. Для этого, можно организовать цикл по задаче Message Queue с помощью контейнера For Loop и ждать пока задача Message Queue не запишет в переменную SSIS значение, которое будет означать успешное завершение других пакетов. Затем с помощью ограничения приоритета On Success можно направить выполнение пакета по следующей ветке.
Контейнер Foreach Loop
Наиболее необычным из новых контейнеров является Foreach Loop. Этот контейнер может сберечь разработчикам традиционных DTS больше всего времени. Контейнер Foreach Loop позволяет разработчикам SSIS организовать цикл по коллекции файлов, записям набора Microsoft ActiveX® Data Objects (ADO), переменным и выполнить последовательность задач.
Очень часто примеры того, как можно использовать контейнер Foreach Loop, можно почерпнуть в процессах ETL. Там, где создавался пакет для цикла по всем файлам директории и запуска для каждого извлеченного файла дочернего пакета. В SQL Server 2000 DTS все это требовало изрядного количества кода в задаче ActiveX Script. В SSIS же все, что нужно, это создать контейнер и задать ему свойство Enumerator в For Each File Enumerator, как это показано на Рисунке 47. Затем в разделе Enumerator Configuration указывается каталог, по которому будет проходить цикл и тип файла. Если нумератор обнаружит файл, то он может присвоить его имя в соединение или переменную SSIS, что можно использовать для динамического запуска пакета внутри цикла.
Рисунок 47
Отображаемая на закладке Collection информация меняется в зависимости от значения свойства Enumerator. Вот некоторые из возможных значений нумератора:
- For Each File Enumerator организует цикл по коллекции файлов для которых нужно выполнить какие-либо действия.
- For Each ADO Enumerator организует цикл по коллекции записей набора ADO. Этот набор должен храниться в переменной пакета.
- For Each From Variable Enumerator организует цикл по переменным пакета.
- For Each NodeList Enumerator организует цикл по XML файлу и требует XPATH информацию.
- For Each SMO Enumerator организует цикл по объектам SQL Server любого уровня.
В процессе выполнения цикла по коллекции контейнер будет присваивать значение из коллекции задаче или соединению внутри контейнера, как это показано на Рисунке 48. Также можно поместить это значение в переменную.
Рисунок 48