Как загружать данные на разные серверы

Я разрабатываю проект 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, но из-за моих сложных запросов это стало очень запутанным.

Есть идеи, как сделать мой запрос динамическим?


person Pouya Kamyar    schedule 05.08.2018    source источник
comment
Простой ответ - дать вашему связанному серверу одно и то же логическое имя, независимо от того, что это за удаленный сервер. Однако вам следует избегать связанных серверов. SSIS лучше для этого. Имейте в виду, что вы редко можете загрузить исходную системную таблицу непосредственно в факт. Всегда требуется какое-то преобразование, в том числе сопоставление суррогатных ключей   -  person Nick.McDermaid    schedule 05.08.2018
comment
@ Nick.McDermaid Спасибо за ваш комментарий, но я не нашел способа изменить логическое имя сервера ссылок. подскажите, как это сделать? И я использовал эти запросы, например, и на самом деле я не вставляю все, от операционной таблицы до факта. Спасибо еще раз   -  person Pouya Kamyar    schedule 05.08.2018
comment
Мне потребовалось около пятнадцати секунд, чтобы найти это stackoverflow.com/questions/11866079/, который говорит использовать EXEC master.dbo.sp_serveroption. Вы это гуглили?   -  person Nick.McDermaid    schedule 05.08.2018
comment
@ Nick.McDermaid Большое спасибо, моя проблема решена   -  person Pouya Kamyar    schedule 06.08.2018


Ответы (3)


По этой ссылке Изменение свойств связанного сервера в SQL Server < / а>

Один из способов решить вашу проблему - убедиться, что логическое имя связанного сервера всегда одинаково, независимо от фактического физического хоста.

Итак, процесс здесь будет следующим:

  1. Создайте связанный сервер с помощью мастера связанных серверов
  2. Используйте это, чтобы переименовать сервер в согласованное имя, которое можно использовать в вашем коде.

i.e.

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

person Nick.McDermaid    schedule 06.08.2018

Я предлагаю вам выполнить следующие шаги для выполнения одного и того же оператора на нескольких серверах. Как предложил @ Nick.McDermaid, я настоятельно рекомендую не использовать связанный сервер. Лучше использовать точное имя сервера в SSIS.

  1. Поместите оператор INSERT в отдельную переменную
  2. Создайте контейнер foreach в SSIS.
  3. Внутри контейнера foreach создайте задачу сценария и получите имя текущего сервера из списка имен серверов. Вы можете иметь список имен серверов, разделенных запятыми, и получить текущий.
  4. Снова внутри контейнера foreach создайте задачу «Выполнить процесс» и вызовите Sqlcmd.exe с информацией о соединении, специфичной для каждого сервера, на основе имени сервера, полученного на шаге № 3, с использованием выражений SSIS. Обратитесь к этому сообщению об использовании выражений for Execute ProcessTask для получения дополнительной информации о вызове задачи Execute process в SSIS.
person Venkataraman R    schedule 05.08.2018

  1. Как насчет создания пакета SSIS, который работает в одной из ваших систем.

  2. Настройте свой рабочий пакет, чтобы он принимал строку подключения

  3. создайте другой пакет, который проходит через ваши строки подключения и вызывает ваш рабочий пакет и передает строку conn

person KeithL    schedule 06.08.2018