BIML. Разбираем ConstraintMode

By | March 7, 2015

В статье я упоминал про разницу между двумя значения аттрибута ConstraintMode элемента Package. Давайте сейчас разберем этот аттрибут подробнее.

Напомню, этот аттрибут задает параллельное (ConstraintMode=Parallel
или последовательное (ConstraintMode=Linear)
выполнение задач. ConstraintMode является обязательным свойством пакета.

Для иллюстрации создадим пакет с тремя задачами.

Linear Constraint

Линейная последовательность создает последовательность выполнения между задачами так как они указаны в скрипте. Создайте скрипт с текстом ниже (не забыв скорректировать строку соединения).

<Biml xmlns=http://schemas.varigence.com/biml.xsd>
<Connections>
<Connection Name=DB_Src ConnectionString=Data Source=SQL\SQL14;Initial Catalog=SSISIncrementalLoad_Source;Provider=SQLNCLI11.1;Integrated Security=SSPI;/>
</Connections>
<Packages>
<Package Name=Precidence_Constraints ConstraintMode=Parallel>
<Tasks>
<ExecuteSQL Name=Select 1 ConnectionName=DB_Src>
<DirectInput>Select 1</DirectInput>
</ExecuteSQL>
<ExecuteSQL Name=Select 2 ConnectionName=DB_Src>
<DirectInput>Select 2</DirectInput>
</ExecuteSQL>
<ExecuteSQL Name=Select 3 ConnectionName=DB_Src>
<DirectInput>Select 3</DirectInput>
</Tasks>
</Package>
</Packages>
</Biml>

 

Получится вот такой пакет:


Parallel Constraint

При параллельном ограничении выполнения задачи по умолчанию создаются без связей и выполняются одновременно.

Поставьте Parallel в строке описания пакета вместо Linear. Итоговый пакет примет вид:


Усложняем

Это были самые простые варианты, но в реальности нам необходимо задавать последовательность выполнения задач и она может быть сложной.

Пусть нам нужно реализовать следующий пакет:


Зададим в пакете последовательное выполнение задач. Тогда по сути между [Select 1] и [Select 2] связь уже готова. А вот для связи между [Select 1] и [Select 3] отдельно нужно написать условие перехода. Она создается в задаче, к которой должно перейти управление, т.е. в нашем случае это [Select 3]. Управляет этим свойство элемент PrecedenceConstraints.

<ExecuteSQL Name=Select 3 ConnectionName=DB_Src>
<DirectInput>Select 3</DirectInput>
<PrecedenceConstraints>
<Inputs>
<Input OutputPathName=Select 1.Output />
</Inputs>
</PrecedenceConstraints>
</ExecuteSQL>

Как видите условие перехода задается по имени задачи-предшественника и слова Output.

Ещё усложним. Пусть теперь нам надо реализовать следующий пакет:


По сути нам надо добавить ещё одну задачу в прошлый пакет и задать условия перехода между задачами [Select 4] и [Select 3]. Условно это можно записать так:

<ExecuteSQL Name=Select 1 />
<ExecuteSQL Name=Select 2 />
<ExecuteSQL Name=Select 3 >
<PrecedenceConstraints Inputs>
<Input OutputPathName=Select 1.Output />
<Input OutputPathName=Select 4.Output />
</PrecedenceConstraints>
</ExecuteSQL>
<ExecuteSQL Name=Select 4 /> 

К сожалению, режим последовательного выполнения задач сам задает связи там где они явно не указаны и мы получили бы следующий пакет.


 Но это не то, что нам нужно. А нужно нам в этой ситуации указать, что у задачи [Select 4] нет предшественника:

<ExecuteSQL Name=Select 4” ConnectionName=DB_Src>
<DirectInput>Select 4</DirectInput>
<PrecedenceConstraints>
<Inputs />
</PrecedenceConstraints>
</ExecuteSQL>

Вот теперь все получится так как надо.

Другие свойства для Constraint

Важным моментом при работе с Constraint (особенно при множественных входах) являются логические условия, а также успешное или неуспешное выполнение предшествующей задачи.

Мы можем задать логическое условие с помощью свойства LogicalType. Это свойства имеет два допустимых значения (And, Or) и указывает что все предшествующие задачи должны быть выполнены перед началом этой (And) или только одна из предшествующих (Or). По умолчанию используется значение AND. Вот такое изменение для задачи [Select 3] из нашего скрипта

<ExecuteSQL Name=Select 3 ConnectionName=DB_Src>
<DirectInput>Select 3</DirectInput>
<PrecedenceConstraints LogicalType=Or>
<Inputs>
<Input OutputPathName=Select 1.Output />
<Input OutputPathName=Select 4.Output EvaluationValue=Failure />
</Inputs>
</PrecedenceConstraints>
</ExecuteSQL>

даст вот такой пакет


Ну, и на последок, давайте создадим условие перехода, которое будет выполняться при неуспешном выполнении предшествующей задачи.


Для этого нам понадобится свойство условия перехода под названием EvaluationValue. Скрипт для задачи будет выглядеть следующим образом:

<ExecuteSQL Name=Select 3” ConnectionName=DB_Src>
<DirectInput>Select 3</DirectInput>
<PrecedenceConstraints LogicalType=And>
<Inputs>
<Input OutputPathName=Select 1.Output />
<Input OutputPathName=Select 4.Output” EvaluationValue=Failure />
</Inputs>
</PrecedenceConstraints>
</ExecuteSQL>

 Как видите все необходимые нам последовательности перехода между задачами пакета легко реализуются в Biml.

P.S. Использовались примеры из статьи

One thought on “BIML. Разбираем ConstraintMode

  1. Pingback: BIML. Сборник статей в этом блоге | Korshikov's

Comments are closed.