我需要将数据从多个分布式数据库(大约 70 个)导入单个源表。那么如何通过 SSIS 2008
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 循环任务是这样配置的:
请注意,ADO 对象源变量设置为User::SourceList
SQL_GetSourceList 任务中填充的变量。
数据流如下所示:
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 表中。
您仍然需要 70 个目标组件。只需在所有这些中指定同一个表。