ssis - использование Foreach для чтения из нескольких баз данных - PullRequest
1 голос
/ 08 сентября 2011

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

enter image description here

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

enter image description here

OLE DB Source на самом деле отличается от других.

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

Спасибо
Ilija

EDIT:
Я нашел статью, которая описывает большую часть того, что мне нужно: 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» (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?

1 Ответ

1 голос
/ 08 сентября 2011

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

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

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

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

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

EDIT

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

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

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

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

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