SSIS ForEach контейнер цикла обработки только одной строки

#ssis #ssis-2016 #ssis-2019

#ssis #ssis-2016 #ssis-2019

Вопрос:

У меня есть простое задание, которое собирает идентификаторы сотрудников и отправляет их в вызов API, который принимает только один идентификатор сотрудника за раз. У меня есть эта настройка с использованием a ForEach Loop Container , передаваемого an Execute SQL Task .

Задание выполняется, как и ожидалось, но оно выполняет цикл только по верхней N записи.

Моя задача выполнения SQL возвращает полный набор результатов в переменную. Моя переменная задана как объектный тип данных.
Выполнить задачу SQL

Выполнить задачу SQL с полной переменной результирующего набора

У меня установлен цикл ForEach Foreach ADO Enumerator , который затем сопоставляется с моей переменной.

Редактор цикла Foreach

Когда я запускаю задание, я не получаю конкретное сообщение об ошибке, сообщающее мне, что я делаю неправильно, но оно завершается сбоем в цикле ForEach, как показано ForEachLoop

Что-нибудь еще, на что я могу обратить внимание?

Ответ №1:

Задача Execute SQL должна помещать результаты в переменную SSIS объектного типа. Я предполагаю associateOID , что это строковый тип, да?

Что вам нужно сделать, это создать переменную SSIS, называемую чем-то вроде rsEmployees типа Object . Затем ваш результирующий набор в Execute SQL Task будет сопоставлен с User::rsEmployees

Измените перечислитель ADO цикла Foreach, чтобы использовать переменную User::rsEmployees

На этом этапе пакет выполнит и сохранит результаты в нашей переменной rsEmployees, а затем перечислитель Foreach выполнит итерацию по записям в нашем наборе. Последняя часть — что-то сделать с текущей строкой. Вот где ваш User::associateOID вступает в игру.

На вкладке Сопоставления переменных перечислителя Foreach добавьте User::associateOID к порядковому номеру 0. Это обеспечит связь между «текущей строкой», которая уничтожается в счетчике, и нашими переменными SSIS

Комментарии:

1. Я обновил свой вопрос. Я использую объектный тип данных для [User::assocaiteOID] . Похоже, я делаю все, что вы предложили, но использую только одну переменную. Когда я добавляю вторую переменную, пакет больше не будет выполняться.

2. Вы должны использовать две переменные. Object это единственное, что может обрабатывать более одного результата из задачи Execute SQL, и вам нужна переменная, зависящая от типа, которая будет использоваться в любом другом бите компонента SSIS.

3. Я вас совершенно неправильно понял. Похоже, теперь мы в деле! У меня был [User::associateOID], установленный как объект. Я изменил это на String и снова последовал вашим указаниям, и теперь у нас есть данные! Спасибо за вашу помощь!