Общий шаблон, который я выбрал бы, был бы примерно таким:
Мой поток управления определит базы данных на сервере, связанном с нашим проектом (Connection Manager = Source)
Здесь я показываю запрос к sys.databases
, потому что, возможно, вы можете применить критерии, подобные AND D.Name IN ('DB1', 'DB2', 'DB3');
На S1, этот запрос будет возвращать 2 значения, наS2, только 1.
Мы использовали бы этот список баз данных как источник перечислителя циклов ForEach для «измельчения» результатов.Для каждого значения, которое мы указали в исходном запросе (DB1, DB2), мы собираемся обновить свойство InitialCatalog
нашего Source ConnectionManager.В приведенных ниже справочных ответах я установил свойство ConnectionString
, но вам нужно только изменить InitialCatalog.Таким образом, каждый цикл, на который указывает база данных, будет меняться.
Поток данных внутри перечислителя ForEach затем упрощается, чтобы иметь дело только с текущей базой данных, и не нужно беспокоиться о том, имеет ли этот сервер 3 исходные базы данных или 1.
Предостережения
Исходный запрос и типы данных должны быть совместимыми со всеми соответствующими базами данных.Структура потока данных устанавливается во время разработки и не может быть изменена во время выполнения.
Если сущности согласованы между базами данных, а столбцы называются как-то по-разному, создайте представление для каждой базы данных, чтобы убедиться, что имя сущности согласованно, и тогда вы можете избежать динамического SQL.
Вам нужно будет указать начальное значение строки подключения источника при запуске пакета.Это можно выполнить с помощью атрибута SET при вызове.
Справочные ответы
Некоторые соответствующие ответы служб SSIS, в которых рассматриваются эти понятия