ssis - использование Foreach для чтения из нескольких баз данных

В настоящее время у меня есть поток управления, который подключается к более чем 20 дБ (та же структура)

введите описание изображения здесь

В этом потоке controlf все то же самое, за исключением потоков данных, которые отличаются только в связи с db. Это пример потока данных:

введите описание изображения здесь

Источник OLE DB - совсем другое дело.

Можно ли в этом случае использовать цикл Foreach, чтобы избежать этих повторений? Если можно, как это сделать? Я не нашел хорошей статьи, в которой описывалось бы, как подключиться к разным БД.

Спасибо,
Илия

РЕДАКТИРОВАТЬ:
Я нашел статью, в которой описывается большая часть того, что мне нужно: http://sql-bi-dev.blogspot.com/2010/07/dynamic-database-connection-using-ssis.html

Я выполнил все шаги формы здесь, но я не понимаю части с запросом. Это запрос из той статьи:

SELECT '' TableName, N'' ConnString, 0 RecordCount, GETDATE() ActionTime

Я не понимаю этого синтаксиса, и я думаю, что здесь возникают ошибки:

[Источник OLE DB 1] Ошибка: произошла ошибка с выходным столбцом "ConnString" (37) на выходе «OLE DB Source Output» (11). Возвращенный статус столбца был: «Текст был усечен или один или несколько символов не соответствовали целевой кодовой странице».

[Источник OLE DB 1] Ошибка: "выходной столбец" ConnString "(37) «сбой из-за усечения», а расположение строки усечения в «выходном столбце« ConnString »(37)» указывает сбой при усечении. Произошла ошибка усечения для указанного объекта указанного компонента.

[SSIS.Pipeline] Ошибка: код ошибки SSIS DTS_E_PRIMEOUTPUTFAILED. Метод PrimeOutput компонента «Источник OLE DB» (1) вернул код ошибки 0xC020902A. Компонент вернул код ошибки, когда механизм конвейера вызвал PrimeOutput (). Значение кода ошибки определяется компонентом, но ошибка является фатальной, и выполнение конвейера прекращается. Перед этим могут быть опубликованы сообщения об ошибках с дополнительной информацией об ошибке.

Я хотел бы получить данные из таблицы с именем Agency (которую я определил в переменной SourceTable = 'Agency' - если я установлю несуществующую таблицу, я получаю сообщение об ошибке, поэтому я думаю, что соединение с исходной БД в порядке) ... и это Меня смущает то, что я нигде не определил, какие столбцы мне нужны, поэтому я предполагаю, что в этом запросе есть ошибка, но я не понимаю его синтаксиса. Любое предложение?

ИЗМЕНИТЬ 2:
Еще одна проблема, с которой я столкнулся, заключается в том, что окно сообщения всегда возвращает мне одно и то же значение в строке подключения - переменная ConnString не изменяется. Как мне присвоить ему значение из переменной SourceList?


person ilija veselica    schedule 08.09.2011    source источник


Ответы (1)


Я думаю, что это возможно. Я бы сделал так:

  1. Коллекция цикла по каждому элементу должна быть «Перечислителем элементов по каждому элементу». На этом этапе в панели конфигурации перечислителя вы можете создать небольшую таблицу. Добавьте столбец со строкой типа. Здесь появятся строки подключения к базам данных.
  2. Создайте строковую переменную и свяжите ее с этим столбцом: перейдите к Сопоставлениям переменных в редакторе цикла по каждому элементу, выберите строковую переменную (например, User :: ConnString), дайте индекс 0. Цикл будет перебирать записи, которые вы установили на первом шаге, и вы можете получить доступ к значениям через эту переменную User :: ConnString.
  3. Добавьте задачу потока данных в контейнер цикла по каждому элементу. Внутри настройте источник OLE DB. Нужен диспетчер соединений. Выберите диспетчер соединений, связанный с подключением OLE DB, перейдите в раздел «Свойства», «Выражения». Выберите свойство ConnectionString и введите @ [User :: ConnString] в столбец выражения (или используйте свое имя переменной).
  4. Найдите все строки подключения, которые вы используете в настоящее время, и введите их в Enumeration Items.

Я думаю, что с помощью этих шагов вы можете упростить поток данных.

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

Конечно, вам нужно копировать не всю строку подключения, а ее изменяющуюся часть. В этом случае вы должны правильно сформулировать свое выражение.

ИЗМЕНИТЬ

Ты прав. В этом примере есть некоторая проблема. (Я думаю, что это немного сложно для вашего решения, но его можно использовать.)

Первый (как вы упомянули) не передавал значения переменным. Я бы завершил шестой шаг следующим: после того, как вы установили User :: SourceList в качестве исходной переменной объекта ADO, выберите Variable Mappings слева. В столбце «Переменные» сначала выберите User :: ConnString (установите индекс равным 0), затем User :: SourceTable, затем (установите индекс равным 1). Это решит ваше второе редактирование с помощью MessageBox. С этого момента он должен показывать правильные значения.

Вторая проблема - это то, что вы написали, с этой ошибкой усечения. Если вы внимательно посмотрите сообщения об ошибках, они говорят, что некоторые строковые столбцы имеют длину 1. И поэтому происходит некоторое усечение. Чтобы решить эту проблему, щелкните правой кнопкой мыши источник OLE DB и выберите «Показать расширенный редактор». Перейдите на последнюю вкладку (Свойства ввода и вывода), разверните столбцы вывода / вывода источника OLE DB. Сначала выберите TableName. С правой стороны, в свойствах типа данных вы должны увидеть Lenght = 1. (SSIS не смог правильно определить длину этого столбца, потому что вы выбираете командную переменную SQL в качестве режима доступа к данным, я думаю). В соответствии с определением таблицы результатов установите для этого значения 128. Также измените длину столбца ConnString с 1 на 256.

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

person luviktor    schedule 08.09.2011
comment
Привет, я отредактировал свой вопрос, не могли бы вы его проверить? Спасибо! - person ilija veselica; 08.09.2011
comment
Это работает, а пока я решил, что эти запросы - не то, что мне нужно, поэтому я написал свой собственный, но эта часть с отображением переменных - именно то, что мне нужно. Спасибо!! - person ilija veselica; 09.09.2011