Как загрузить данные на разных серверах
Я разрабатываю проект ETL для SSIS и хочу, чтобы он был динамичным. Я буду использовать этот проект для многих клиентов, поэтому я буду запрашивать эти извлечения на разных серверах.
Например, у меня есть этот запрос в шаге с компонентом "выполнить задачу SQL":
INSERT DataWarehouse.schema.fact1
SELECT *
FROM Database.schema.table1
Мой хранилище данных всегда находится на локальном хосте, но "Database.schema.table1" может находиться на разных серверах, поэтому у меня будут разные серверы ссылок на серверах наших клиентов для извлечения его данных.
Это означает, например, что мне нужно изменить запрос следующим образом для customer1:
INSERT DataWarehouse.schema.fact1
SELECT *
FROM [192.168.1.100].Database.schema.table1
А для customer2 мне нужно, чтобы запрос был таким:
INSERT DataWarehouse.schema.fact1
SELECT *
FROM [10.2.5.100].Database.schema.table1
Я пробовал извлекать и загружать компоненты SSIS, но из-за моих сложных запросов это стало настолько грязным.
Есть идеи, как сделать мой запрос динамичным?
3 ответа
По этой ссылке Изменение свойств связанного сервера в SQL Server
Один из способов решения вашей проблемы - убедиться, что логическое имя связанного сервера всегда одинаково, независимо от того, что является физическим хостом.
Так что процесс здесь будет:
- Создайте связанный сервер с помощью мастера связанных серверов
- Используйте это, чтобы переименовать сервер в непротиворечивое имя, которое может использоваться в вашем коде
т.е.
EXEC master.dbo.sp_serveroption
@server=N'192.168.1.100',
@optname=N'name',
@optvalue=N'ALinkedServer'
Теперь вы можете обратиться к ALinkedServer
в вашем коде
Лучший способ - правильно написать сценарий создания связанного сервера - не используйте мастер SSMS
Вот шаблон - вам нужно больше исследований, чтобы найти правильные значения здесь
USE master;
GO
EXEC sp_addlinkedserver
@server = 'ConsistentServerName',
@srvproduct = 'product name',
@provider = 'provider name',
@datasrc = 'ActualPhysicalServerName',
@location = 'location',
@provstr = 'provider string',
@catalog = 'catalog';
GO
Но последнее слово: не используйте связанные серверы. Использовать SSIS
Как насчет создания пакета служб SSIS, который работает для одной из ваших систем.
Параметризация вашего рабочего пакета, чтобы принять строку подключения
создайте другой пакет, который перебирает ваши строки подключения, вызывает ваш рабочий пакет и передает строку conn
Я бы предложил вам выполнить следующие шаги для выполнения одного и того же оператора на нескольких серверах. В соответствии с предложением @Nick.McDermaid, я настоятельно рекомендую использовать связанный сервер. Лучше указывать точное имя сервера в SSIS.
- Поместите оператор INSERT в отдельную переменную
- Создайте контейнер foreach в SSIS.
- Внутри контейнера foreach создайте задачу сценария и получите текущее имя сервера из списка имен серверов. Вы можете иметь разделенный запятыми список имен серверов и получить текущий.
- Снова внутри контейнера foreach создайте задачу "Выполнение процесса" и вызовите Sqlcmd.exe с информацией о подключении, специфичной для каждого сервера, на основе имени сервера, полученного на шаге № 3, с использованием выражений SSIS. Обратитесь к этой публикации Stackru об использовании выражений для Execute Process Task для получения дополнительной информации о вызове задачи "Выполнение процесса" в службах SSIS.