2012-05-24 2 views
1

У меня есть пакет SSIS, который обновляет пару таблиц, используя скрипты и контейнер foreach среди других вещей. Я использую SqlConnection и SqlCommand вызвать этот запрос в задаче сценария перед контейнером Еогеасп:Как я могу использовать контейнер цикла foreach в SSIS для итерации через многомерный массив?

SELECT TOP 10 DirectoryID, DirectoryPath FROM ProjectDirectory ORDER BY LastAudit

и я использую SqlDataReader, чтобы добавить их в многомерный массив [10,2]. Я назначаю массив переменной объекта DirectoryList, чтобы я мог перебирать ее в контейнере цикла foreach. Он должен выглядеть как {{"1", "C: \ Folder1"}, {"2", "C: \ Folder2"}, ...} Верю.

Проблема в том, что я только начал использовать это программное обеспечение пару дней назад, и я смущен тем, как контур цикла foreach проходит через переменную DirectoryList. На данный момент на вкладке коллекции контейнера у меня есть Enumerator, установленный в Foreach From Variable Enumerator, с переменной, заданной как User::DirectoryList. У меня есть переменные User::DirectoryID, установленные для индекса 0, а User::DirectoryPath установлены в индекс 1. Я пытаюсь заставить его пройти через только верхний уровень массива, так что в каждом цикле идентификаторы и переменные пути присваиваются «1», и «C: \ Folder1», а затем в следующий раз, когда он пройдет через цикл, они назначены «2» и «C: \ Folder2» и т. д. У меня есть компонент скрипта, который использует путь для поиска некоторой информации, и я используйте id для обновления правильной строки таблицы sql.

Чтобы отладить, мне нужно показать ID и путь MessageBox.Show(Variables.DirectoryID + ", " + Variables.DirectoryPath) первой итерации, и она показывает «8, 8». 8 соответствует идентификатору строки, которая должна отображаться первой. В следующий раз, когда он пройдет, он даст мне правильный путь дважды: «C: \ Folder1, C: \ Folder1». Таким образом, видимо, отображение переменных не работает, оно отображает обе переменные в один и тот же индекс. В любом случае он не работает, поэтому я думаю, что (или, может быть, и то, и другое?) Foreach From Variable Enumerator не тот, который я должен выбрать, или что я не могу использовать многомерный массив в контейнере foreach. Я искал и ничего не нашел, и все это может быть трудно понять, но любые предложения?

ответ

2

ОК, вы на самом деле не должны этого делать. Поскольку ваш источник является запросом t-sql, вы могли бы запустить его с помощью «выполнить SQL-задачу». Но все в порядке, это тоже можно сделать. Я фактически работаю над пакетом прямо сейчас, чтобы получить результирующий набор в datatable в задаче сценария и загружать его в переменную объекта, как это происходит с вашим каталогом DirectoryList.

Чтобы прочитать значения, просто настроить свой цикл, как это, где переменная является переменной объекта:

enter image description here

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

enter image description here

и вот оно, внутри цикла вы будете иметь доступ к переменным с текущими значениями

+1

Удивительного спасибо! Я в конечном итоге использовал Execute SQL Task, потому что, как вы сказали, это действительно весь скрипт. Теперь я просто пытаюсь выяснить, как передать переменную DateTime в другую задачу SQL Execute и обновить одну строку в таблице. Спасибо, спасибо! –

Смежные вопросы