如何在不同的服务器加载数据

How to load data in different servers

我正在 SSIS 上设计一个 ETL 项目,我希望它是动态的。我将为许多客户使用这个项目,因此我将针对不同的服务器查询这些提取。

例如,我在 "execute SQL task" 组件的步骤中有此查询:

        INSERT DataWarehouse.schema.fact1

        SELECT  *
        FROM    Database.schema.table1

我的数据仓库总是在本地主机上,但是 "Database.schema.table1" 可能在不同的服务器上,因此我将在我们客户的服务器上有不同的链接服务器来检索它的数据。

这意味着,例如,我需要对客户 1 进行这样的查询更改:

        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 组件提取和加载,但由于我的复杂查询,它变得如此混乱。

有什么想法可以使我的查询动态化吗?

我建议您按照以下步骤在多台服务器上执行相同的语句。正如@Nick.McDermaid 所建议的那样,我强烈建议不要使用链接服务器。最好在 SSIS 中使用确切的服务器名称。

  1. 将 INSERT 语句放入一个单独的变量中
  2. 在 SSIS 中创建一个 foreach 容器。
  3. 在 foreach 容器内,有一个脚本任务并从服务器名称列表中获取当前服务器名称。您可以使用逗号分隔的服务器名列表并获取当前服务器名。
  4. 同样,在 foreach 容器内,使用 SSIS 表达式,根据在第 3 步中获得的服务器名称,使用特定于每个服务器的连接信息创建执行进程任务并调用 Sqlcmd.exe。有关在 SSIS 中调用执行进程任务的更多信息,请参阅此

按照这个 link Changing Properties of a Linked Server in SQL Server

解决您的问题的一种方法是确保 linked 服务器逻辑名称始终相同,无论实际物理主机是什么。

所以这里的过程是:

  1. 使用 linked 服务器向导创建 linked 服务器
  2. 使用此选项将服务器重命名为可在您的代码中使用的一致名称

EXEC master.dbo.sp_serveroption 
@server=N'192.168.1.100', 
@optname=N'name', 
@optvalue=N'ALinkedServer'

现在您可以在代码中引用ALinkedServer

更好的方法是正确编写 linked 服务器创建脚本 - 不要使用 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

但最后一句话是:不要使用 linked 服务器。使用 SSIS

  1. 如何制作适用于您的系统之一的 SSIS 包。

  2. 参数化您的工作包以接受连接字符串

  3. 创建另一个包,循环遍历您的连接字符串并调用您的工作包并传递连接字符串