SSIS - Как установить значение родительской переменной из дочернего пакета с помощью модели развертывания пакета - PullRequest
1 голос
/ 07 мая 2020

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

Переменные из родительского и дочернего элементов имеют точно такие же имена. Я сослался на родительскую переменную в дочернем пакете, используя конфигурацию пакета. CHILD PACKAGE

Затем я устанавливаю значение в задаче дочернего скрипта: CHILD

Значение установлено правильно (от 0 до 1): Child script result

Но вернемся к родительскому элементу, значение по-прежнему равно 0 (ожидается 1): Parent result

Поскольку я использую модель развертывания пакетов, я не могу добавить привязку параметров. Parent Package

1 Ответ

0 голосов
/ 08 мая 2020

tl; dr;

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

установка

Для родительского пакета с 4 переменными: Col1, Col2, ParentVariableSimple все как Int32 и ParentVariableObject

Parent package

До

Это Задача «Выполнение сценария», которая просто отображает значения переменных. Добавьте все 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 переменных.

Дочерний пакет

Мой дочерний пакет определяется как

enter image description here

Здесь определены две переменные: 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.

Заключительные мысли

Это взлом. Да, работает. Те, кто будет поддерживать этот пакет после вас, будут проклинать ваше имя до скончания веков. Более чистый подход - это ... вызвать событие в дочернем пакете. Запишите значение этого прогона в таблицу и попросите родителя прочитать его. Возможно, что-то еще, но это всего лишь технический ответ на вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...