数据从SSIS中的多个源传输到单个目标

时间:2013-01-18 10:06:57

标签: sql-server-2008 ssis

我需要将数据从多个分布式数据库(大约70个)导入单个源表。那么如何才能通过SSIS 2008

2 个答案:

答案 0 :(得分:2)

假设您可以针对70个源服务器中的每一个运行相同的查询,则可以将ForEach循环与单个数据流任务一起使用。源连接管理器的ConnectionString应该是使用循环变量的表达式。

以下是从多个数据库中读取INFORMATION_SCHEMA.COLUMNS视图的示例。我在本地实例上创建了以下表格:

<!-- language: lang-sql -->
CREATE TABLE [MultiDbDemo].[SourceConnections](
    [DatabaseKey] [int] IDENTITY(1,1) NOT NULL,
    [ServerName] [varchar](50) NOT NULL,
    [DatabaseName] [varchar](50) NOT NULL,
 CONSTRAINT [PK_SourceConnections] PRIMARY KEY CLUSTERED 
(
    [DatabaseKey] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

CREATE TABLE [MultiDbDemo].[SourceColumns](
    [ColumnKey] [int] IDENTITY(1,1) NOT NULL,
    [ServerName] [varchar](50) NOT NULL,
    [DatabaseName] [varchar](50) NOT NULL,
    [SchemaName] [varchar](50) NOT NULL,
    [TableName] [varchar](50) NOT NULL,
    [ColumnName] [varchar](50) NOT NULL,
 CONSTRAINT [PK_SourceColumns] PRIMARY KEY CLUSTERED 
(
    [ColumnKey] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

这是SSIS包的控制流程: enter image description here

Source_AdoDotNet连接管理器的ConnectionString属性设置为以下表达式:
enter image description here

SQL_GetSourceList的SQLStatement属性为SELECT ServerName, DatabaseName FROM MultiDbDemo.SourceConnectionsResultSet映射到User::SourceList变量。

ForEach Loop任务因此配置:
enter image description here 请注意,ADO对象源变量设置为SQL_GetSourceList任务中填充的User::SourceList变量。 enter image description here

数据流如下:
enter image description here

ADO_SRC_SourceInfo因此配置:
enter image description here

所有这一切的下一个影响是,对于SourceConnections表中列出的每个数据库,我们执行查询SELECT LEFT(TABLE_SCHEMA, 50) AS SchemaName, LEFT(TABLE_NAME, 50) AS TableName, LEFT(COLUMN_NAME, 50) AS ColumnName FROM INFORMATION_SCHEMA.COLUMNS并将结果保存在SourceColumns表中。

答案 1 :(得分:0)

您仍需要70个目标组件。只需在所有表中指定相同的表格。