我正在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组件进行提取和加载,但由于我的查询复杂,因此变得非常混乱。
有什么想法可以使我的查询动态化吗?
答案 0 :(得分:2)
根据此链接Changing Properties of a Linked Server in 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
答案 1 :(得分:0)
我建议您执行以下步骤以在多个服务器上执行相同的语句。如@ Nick.McDermaid所建议,我强烈建议不要使用链接服务器。最好在SSIS中输入确切的服务器名称。
答案 2 :(得分:0)
如何制作适用于您的系统之一的SSIS软件包。
参数化您的工作包以接受连接字符串
创建另一个通过您的连接字符串循环并调用您的工作包并传递conn字符串的包