Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SSIS В диспетчере соединений не видно переменную объявленную в контейнере forEach  [new]
LarionovPV
Member

Откуда: Росиия, Владивосток
Сообщений: 6
Добрый день!

Нужна помощь с простым ETL проектом SSIS. Не могу разобраться почему переменная "User::varFileName" созданная в контейнере
"Цикл для каждого элемента", где перебираются текст. файлы и для каждого вызывается поток выгрузки, переменная недоступна в
построителе выражений Диспетчера соединений с неструктурированным файлом. в тоже время, например, переменная доступна в диалоге построителя
если запустить его из свойств пакета.
Проблема в контексте доступа к переменным, я выяснил что в диспетчере соединений видно переменные проекта,
а переменные пакета и пользовательские "User" не видно


Картинка с другого сайта.
Картинка с другого сайта.
Картинка с другого сайта.
Картинка с другого сайта.
12 мар 16, 08:28    [18922816]     Ответить | Цитировать Сообщить модератору
 Re: SSIS В диспетчере соединений не видно переменную объявленную в контейнере forEach  [new]
Ferdipux
Member

Откуда: Москва
Сообщений: 554
LarionovPV,

Такое поведение по определению, и по логике - оно правильное.
Смотрите, connection manager определен на уровне проекта (у вас). Этот CM доступен всем пакетам проекта. Чтобы использовать динамические определения, например, переменные значения connection string, они должны быть определены на уровне проекта. Почему - подстановки через expressoin определены в самом объекте CM.
А на уровне проекта - только параметры проекта.
Если вы определите CM на уровне пакета - у него в подстановках появятся параметры проекта и пакета.

Если вы очень хотите делать такую подстановку в цикле - сделайте в цикле основного пакеты вызов другого пакета из проекта, который только пишет в файл, и передавайте в значение переменной подпакета ваш conn string.
12 мар 16, 09:04    [18922838]     Ответить | Цитировать Сообщить модератору
 Re: SSIS В диспетчере соединений не видно переменную объявленную в контейнере forEach  [new]
LarionovPV
Member

Откуда: Росиия, Владивосток
Сообщений: 6
Ferdipux,

Спасибо! подскажите плиз, как определить СМ на уровне пакета, я могу добавлять их только в группу "Диспетчеры соединений"
может в самом СМ можно где-то указать принадлежность к пакету?
Картинка с другого сайта.
12 мар 16, 09:29    [18922860]     Ответить | Цитировать Сообщить модератору
 Re: SSIS В диспетчере соединений не видно переменную объявленную в контейнере forEach  [new]
LarionovPV
Member

Откуда: Росиия, Владивосток
Сообщений: 6
Ferdipux,

Ferdipux
Если вы очень хотите делать такую подстановку в цикле - сделайте в цикле основного пакеты вызов другого пакета из проекта, который только пишет в файл, и передавайте в значение переменной подпакета ваш conn string.


у меня как раз проблема в том что в пакете в источниках данных используются "диспетчеры соединений" которые не видят контекста "User::Variables", переменных созданных на уровне пакета, если я из одного пакета буду запускать другой пакет и передам ему переменную диспетчер источника не увидит и ее тоже, т.к. это будет переменная пакета, а в ДС видно только переменные проекта которые невозможно установить программно. Не могу понять как решить эту проблему с контекстом видимости?!
12 мар 16, 09:43    [18922864]     Ответить | Цитировать Сообщить модератору
 Re: SSIS В диспетчере соединений не видно переменную объявленную в контейнере forEach  [new]
LarionovPV
Member

Откуда: Росиия, Владивосток
Сообщений: 6
Подскажите плиз, как в проекте SSIS об'явить переменную в глобальном контексте проекта, чтобы ее можно было устанавливать и читать в любом пакете, тогда я мог бы забивать ее в цикле контейнера и читать в диспетчере соединений в файлом источником...
12 мар 16, 12:38    [18923191]     Ответить | Цитировать Сообщить модератору
 Re: SSIS В диспетчере соединений не видно переменную объявленную в контейнере forEach  [new]
LoopN
Guest
LarionovPV,

в обозреватели решений "решение sistb - проект служб ssis1 - project.param - ПКМ добавить"
Либо по переменной пакета - ПКМ конвертировать в переменную проекта
12 мар 16, 13:33    [18923312]     Ответить | Цитировать Сообщить модератору
 Re: SSIS В диспетчере соединений не видно переменную объявленную в контейнере forEach  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
LarionovPV,

У переменной есть область видимости -- по умолчанию для ForEach она видна только в блоке ForEach. Вам надо было создать переменную на уровне пакета.
12 мар 16, 15:00    [18923475]     Ответить | Цитировать Сообщить модератору
 Re: SSIS В диспетчере соединений не видно переменную объявленную в контейнере forEach  [new]
Ferdipux
Member

Откуда: Москва
Сообщений: 554
LarionovPV

у меня как раз проблема в том что в пакете в источниках данных используются "диспетчеры соединений" которые не видят контекста "User::Variables", переменных созданных на уровне пакета, если я из одного пакета буду запускать другой пакет и передам ему переменную диспетчер источника не увидит и ее тоже, т.к. это будет переменная пакета, а в ДС видно только переменные проекта которые невозможно установить программно. Не могу понять как решить эту проблему с контекстом видимости?!

Вам нужно сделать следующее:
1. Определить подпакет, в нем - определить диспетчер соединений уровня пакета. Это можно сделать - в окне менеджеров соединений - выбрать "Создать..." и создать СМ уровня пакета.
2. Для подпакета - определить параметр пакета (именно параметр, а не переменную) типа string, в которой будете передавать строку подключения. Пусть он будет называться P_CM_ConnStr.
3. Настраиваете через expressions для СМ - подстановку этого параметра в качестве строки подключения СМ.
4. В основном пакете - сделать задачу выполнения пакета SSIS, тип - project reference, на вкладке параметров - добавляете кнопкой Add связь между параметром P_CM_ConnStr и любой переменной основного пакета с типом string, которая видна в основном пакете в этом месте.

Как-то так...
12 мар 16, 21:58    [18924322]     Ответить | Цитировать Сообщить модератору
 Re: SSIS В диспетчере соединений не видно переменную объявленную в контейнере forEach  [new]
LarionovPV
Member

Откуда: Росиия, Владивосток
Сообщений: 6
Ferdipux, Спасибо мне достаточно было понять как объявить СМ на уровне пакета :)

Картинка с другого сайта.
13 мар 16, 03:58    [18924839]     Ответить | Цитировать Сообщить модератору
 Re: SSIS В диспетчере соединений не видно переменную объявленную в контейнере forEach  [new]
LarionovPV
Member

Откуда: Росиия, Владивосток
Сообщений: 6
Еще один способ установки ConnectionString диспетчера соединений пакета - из скрипта.
может кому пригодится :)

Картинка с другого сайта.
13 мар 16, 04:35    [18924866]     Ответить | Цитировать Сообщить модератору
 Re: SSIS В диспетчере соединений не видно переменную объявленную в контейнере forEach  [new]
Ferdipux
Member

Откуда: Москва
Сообщений: 554
LarionovPV
Еще один способ установки ConnectionString диспетчера соединений пакета - из скрипта.

Можно и так, но не люблю, по возможности обхожу структурами пакетов (к примеру, как предлагал выше).
Такой хак мало нагляден и создает следующий риск - при запуске пакет валидируется - для этого вызываются методы AcquireConnections, Validate. Метод AcquireConnections проверяет - можно ли вообще открыть такой Conn Manager.
С хаком проблема, что проверочные методы AcquireConnections и Validate уже вызваны и вернули ok для оригинального connection. При запуске через подпакет - он проверит connection string и в случае чего - вернет ошибку открытия подключения в процессе валидации. В случае вашего скрипта - ошибку может вернуть та задача где данный CM используется, но ее описание может быть довольно мутным - вида ошибка HRESULT = 0x...
14 мар 16, 08:16    [18926661]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить