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

时间:2018-08-05 06:26:51

标签: sql-server ssis dynamicquery

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

例如,我使用“执行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 个答案:

答案 0 :(得分:2)

根据此链接Changing Properties of a Linked Server in SQL Server

解决问题的一种方法是确保链接服务器的逻辑名称始终相同,而不管实际的物理主机是什么。

所以这里的过程将是:

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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