我需要将数据从多个分布式数据库(大约70个)导入单个源表。那么如何才能通过SSIS 2008
答案 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包的控制流程:
Source_AdoDotNet连接管理器的ConnectionString
属性设置为以下表达式:
SQL_GetSourceList的SQLStatement
属性为SELECT ServerName, DatabaseName FROM MultiDbDemo.SourceConnections
,ResultSet
映射到User::SourceList
变量。
ForEach Loop任务因此配置:
请注意,ADO对象源变量设置为SQL_GetSourceList任务中填充的User::SourceList
变量。
数据流如下:
ADO_SRC_SourceInfo因此配置:
所有这一切的下一个影响是,对于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个目标组件。只需在所有表中指定相同的表格。