|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
10.21. Контейнеры SSISКонтейнеры SSIS SQL Server 2005, For Loop, Foreach Loop, Sequence, Task Host В SQL Server Integration Services появилась новая возможность — контейнеры. Контейнеры — это специальные задачи Control Flow, которые предназначены для размещения в них других задач Control Flow. В основном контейнеры используются для организации циклов в пакетах. Отметим, что в DTS 2000 цикл в пакете можно было организовать только при помощи программирования (средствами ActiveX Script Task). Такая же возможность (но уже с применением Script Task) осталась и в SSIS, но использование контейнеров проще и удобнее. В SSIS предусмотрено четыре типа контейнеров: q For Loop; q Foreach Loop; q Sequence; q Task Host. Все контейнеры доступны в Toolbox на вкладке Control Flow, кроме Task Host. Этот контейнер создается автоматически для любой задачи и используется для хранения значений свойств, настроенных на графическом экране SSIS Designer для этой задачи. Task Host нельзя увидеть в SSIS Designer — обращение к нему возможно только из программного кода, и поэтому здесь этот контейнер рассматриваться не будет. Контейнер For Loop предназначен для организации цикла. Как и синтаксическая конструкция For Loop в программном коде, этот контейнер используется в тех ситуациях, когда вам с самого начала известно, сколько раз должен быть выполнен тот или иной набор задач Control Flow. Для этого контейнера предусмотрено три главных свойства: q InitExpression — определяет исходное значение счетчика. Например, если в вашем пакете определена целочисленная переменная Counter, то значение этого свойства может выглядеть как @Counter = 0; q EvalExpression — проверяемое выражение. Цикл будет выполняться до тех пор, пока это выражение возвращает истину. Например, если вам нужно выполнить какие-то задачи пять раз, то значение этого свойства может выглядеть как @Counter < 5; q AssignExpression — выражение, которое будет изменять значение вашего счетчика. Оно может выглядеть, например, как @Counter = @Counter + 1. После настройки свойств контейнера For Loop вам останется просто перетащить в него нужную задач (или набор задач) из ToolBox и настроить их. Контейнер Foreach Loop, более сложный и функциональный, используется чаще. Программная конструкция Foreach применяется для того, чтобы пройти по всем элементам какой-то коллекции. Для этой же цели используется и контейнер Foreach Loop. В нем можно проходить по элементам следующих коллекций: q File Enumerator — эта коллекция позволяет пройти по всем файлам какой-либо папки в файловой системе. Можно настроить фильтр для имен и расширений файлов, а также выбрать, будете ли вы проходить по вложенным папкам. Имена файлов можно передать в переменные пакета (об этом будет рассказываться в разд. 10.25) и использовать их для других задач, например, для Data Flow Task или File System Task; q Item Enumerator — проход по записям таблицы, которую нужно будет создать прямо в окне свойств этого контейнера. Это самый простой, но и самый неудобный в использовании тип коллекции; q ADO Enumerator — проход по всем записям в объекте ADO.Recordset, или по всем записям объекта DataTable объекта DataSet в ADO.NET, или по всем записям во всех таблицах объекта DataSet в ADO.NET, или по объектам таблиц в DataSet. Для этой коллекции вам потребуется указать имя объектной переменной пакета, в которой будет храниться соответствующий объект ADO.Recordset или DataSet; q ADO.NET Schema Rowset Enumerator — коллекция объектов определенного типа на источнике данных OLE DB. Под "schema" в данном случае подразумевается тип объекта (таблица, представление, хранимая процедура), а не схема SQL Server 2005. Вы можете выбрать источник данных (только OLE DB), базу данных и тип объекта, а также настроить фильтр для свойств этого объекта, например, фильтр на имя таблицы; q From Variable Enumerator — проход по набору элементов в коллекции, которая находится в переменной пакета. Например, в переменной может находиться набор записей, возвращенных запросом Execute SQL Task; q Nodelist Enumerator — проход по всем узлам документа XML, которые были отфильтрованы при помощи выражения XPath; q SMO Enumerator — коллекция объектов SMO (например, таблиц, представлений, хранимых процедур на SQL Server 2005). Этот вариант требует менеджера подключений SMO Connection Manager и строки в формате URN, которая будет отфильтровывать нужные объекты. Ее можно сгенерировать в автоматическом режиме. Удобство применения контейнера Foreach Loop во многом объясняется тем, что он умеет передавать информацию о текущем обрабатываемом элементе переменным пакета. Затем можно использовать эти значения, например, для того, чтобы изменить свойства элементов пакета, помещенных в этот контейнер для загрузки всех файлов из каталога на SQL Server. Для настройки соответствий переменных возвращаемым значениям используется вкладка Variable Mappings (Привязки переменнных) свойств контейнера Foreach Loop. На ней вы можете указать, в какую переменную какое из набора значений, получаемых для данного элемента, будет передаваться. Например, если вы работаете с коллекцией ADO Enumerator, то индексу 0 будет соответствовать значение из первого столбца таблицы для данной записи, индексу 1 — из второго и т. п. К сожалению, для большинства коллекций такая привязка неочевидна. Например, если вы используете коллекцию File Enumerator, то что будет соответствовать первому столбцу, а что — второму? В документации к SQL Server этой информации автору обнаружить не удалось. Скорее всего, самый лучший способ в этой ситуации — провести эксперимент и, например, вывести значение каждой переменной при помощи функции MsgBox в Script Task. Последний контейнер Control Flow называется Sequence. Это самый простой из контейнеров. Обычно он используется только для одной цели — сгруппировать набор элементов, чтобы их можно было одновременно отключать без удаления. Для этого достаточно просто воспользоваться свойством Disable (Отключить) этого контейнера. Кроме того, на уровне контейнера можно объявлять переменные, которые не будут видны в других частях пакета.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Получить учебные материалы по этому курсу |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||