tl; dr;
Удалите HasFrontOrderDataFile вашего дочернего пакета. Дочерний пакет не сможет работать сам по себе, и многие задачи будут предупреждать и / или отображать красные крестики, указывающие, что они сломаны, но когда родительский пакет запускается, они будут работать.
установка
Для родительского пакета с 4 переменными: Col1, Col2, ParentVariableSimple все как Int32 и ParentVariableObject
До
Это Задача «Выполнение сценария», которая просто отображает значения переменных. Добавьте все 4 как переменные только для чтения для этой задачи
bool fireAgain = false;
string message = "{0}::{1} : {2}";
foreach (var item in Dts.Variables)
{
Dts.Events.FireInformation(0, "SCR Echo Back", string.Format(message, item.Namespace, item.Name, item.Value), string.Empty, 0, ref fireAgain);
}
Выполнить задачу пакета
Это будет запускать дочерний пакет. Я определил, что диспетчер соединений с файлами указывает на Child.dtsx
FEL C Shred ParentVariableObject
Это стандартный шаблон перечисления набора записей ADO. Я собираюсь получить значения из порядковых позиций 0 и 1 объекта ParentVariableObject.
После
Это та же задача сценария, которая выводит значения 4 переменных.
Дочерний пакет
Мой дочерний пакет определяется как
Здесь определены две переменные: ChildVariable как int и ChildObjectVariable как объект ( и не используется). ChildVariable инициализируется значением -2. Если он переходит в -1, то мы знаем, что мы правильно вытащили родительское значение.
В конфигурации пакета я сопоставил User :: ParentVariableSimple со свойством Value ChildVariable.
SCR Echo
Та же задача сценария, что и в родительском пакете. Я передаю в него обе дочерние переменные.
Scr Increment на 10
Вот где вещи go странно;)
Я передаю две ReadWriteVariables: User :: ChildVariable, User :: ParentVariableSimple
Теперь вы не можете выбрать ParentVariableSimple из пользовательского интерфейса, вы должны правильно ввести переменную в том виде, в котором она существует в родительском пакете. Внутри мой код аналогичен приведенному выше.
foreach (var item in Dts.Variables)
{
item.Value = (int)item.Value + 10;
}
На этом этапе мы изменяем значение в родительском пакете!
SQL Загрузить родительскую переменную
Я собираюсь создать набор данных в памяти с помощью запроса здесь. Предполагая диспетчер соединений OLE DB, настройте его
- ResultSet = Полный набор результатов
- SQLStatement = SELECT? AS Col1,? AS Col2;
Сопоставление параметров
- User :: ChildVariable - ParameterName 0
- User :: ParentVariableSimple - ParameterName 1
Набор результатов
- Имя результата 0 - Имя переменной - User :: ParentVariableObject
Результаты
Результат выполнения показан ниже. В FEL C Col1 будет значением дочерней переменной, а Col2 будет измененным значением родительской переменной, которое также удобно отображается эхом.
SSIS package "C:\Users\bfellows\source\repos\PackageDeploymentModel\PackageDeploymentModel\Parent.dtsx" starting.
Information: 0x0 at Before, SCR Echo Back: User::Col1 : 0
Information: 0x0 at Before, SCR Echo Back: User::Col2 : 0
Information: 0x0 at Before, SCR Echo Back: User::ParentVariableObject : System.Object
Information: 0x0 at Before, SCR Echo Back: User::ParentVariableSimple : -1
Executing ExecutePackageTask: C:\Users\bfellows\source\repos\PackageDeploymentModel\PackageDeploymentModel\Child.dtsx
Information: 0x40016042 at Child: The package is attempting to configure from the parent variable "User::ParentVariableSimple".
Information: 0x40016042 at Child: The package is attempting to configure from the parent variable "User::ParentVariableSimple".
Information: 0x0 at SCR Echo, SCR Echo Back: User::ChildObjectVariable : System.Object
Information: 0x0 at SCR Echo, SCR Echo Back: User::ChildVariable : -1
Information: 0x0 at After, SCR Echo Back: User::Col1 : 9
Information: 0x0 at After, SCR Echo Back: User::Col2 : 9
Information: 0x0 at After, SCR Echo Back: User::ParentVariableObject : System.__ComObject
Information: 0x0 at After, SCR Echo Back: User::ParentVariableSimple : 9
SSIS package "C:\Users\bfellows\source\repos\PackageDeploymentModel\PackageDeploymentModel\Parent.dtsx" finished: Success.
Заключительные мысли
Это взлом. Да, работает. Те, кто будет поддерживать этот пакет после вас, будут проклинать ваше имя до скончания веков. Более чистый подход - это ... вызвать событие в дочернем пакете. Запишите значение этого прогона в таблицу и попросите родителя прочитать его. Возможно, что-то еще, но это всего лишь технический ответ на вопрос.