首页 > 解决方案 > 如何在不同的服务器中加载数据

问题描述

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

例如,我在带有“执行 SQL 任务”组件的步骤中有这个查询:

        INSERT DataWarehouse.schema.fact1

        SELECT  *
        FROM    Database.schema.table1

我的数据仓库始终位于 localhost 但“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 组件进行提取和加载,但由于我的查询复杂,它变得如此混乱。

任何想法如何使我的查询动态?

标签: sql-serverssisdynamicquery

解决方案


根据此链接更改 SQL Server 中链接服务器的属性

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

所以这里的过程是:

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

IE

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


推荐阅读