使用批量操作插入或更新的 SSIS 2008 R2 示例包:
这是一个示例包SSIS 2008 R2,说明了如何使用批处理操作在两个数据库之间执行插入、更新。
- 使用
OLE DB Command会减慢包的更新操作,因为它不执行批处理操作。每行都单独更新。
该示例使用两个数据库,即Source和Destination。在我的示例中,两个数据库都驻留在服务器上,但逻辑仍然可以应用于驻留在不同服务器和位置的数据库。
dbo.SourceTable我在我的源数据库中创建了一个名为的表Source。
CREATE TABLE [dbo].[SourceTable](
[RowNumber] [bigint] NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[ModifiedOn] [datetime] NOT NULL,
[IsActive] [bit] NULL
)
此外,在我的目标数据库中创建了两个名为dbo.DestinationTable和的表。dbo.StagingTableDestination
CREATE TABLE [dbo].[DestinationTable](
[RowNumber] [bigint] NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[ModifiedOn] [datetime] NOT NULL
)
GO
CREATE TABLE [dbo].[StagingTable](
[RowNumber] [bigint] NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[ModifiedOn] [datetime] NOT NULL
)
GO
dbo.SourceTable将表中具有唯一值的大约 140 万行插入到RowNumber列中。桌子dbo.DestinationTable一dbo.StagingTable开始都是空的。表中的所有行都dbo.SourceTable将标志IsActive设置为 false。

创建了一个带有两个 OLE DB 连接管理器的 SSIS 包,每个连接管理器都连接到Source数据库Destination。设计控制流程如下图:
首先对目标数据库Execute SQL Task执行语句TRUNCATE TABLE dbo.StagingTable以截断登台表。
下一节将解释如何Data Flow Task配置。
SecondExecute SQL Task执行下面给定的 SQL 语句,该语句dbo.DestinationTable使用 中可用的数据更新数据dbo.StagingTable,假设这两个表之间存在匹配的唯一键。在这种情况下,唯一键是 column RowNumber。
更新脚本:
UPDATE D
SET D.CreatedOn = S.CreatedOn
, D.ModifiedOn = S.ModifiedOn
FROM dbo.DestinationTable D
INNER JOIN dbo.StagingTable S
ON D.RowNumber = S.RowNumber

我设计了如下所示的数据流任务。
OLE DB Sourcedbo.SourceTable使用 SQL 命令读取数据SELECT RowNumber,CreatedOn, ModifiedOn FROM Source.dbo.SourceTable WHERE IsActive = 1
Lookup transformation用于检查表中是否已经存在 RowNumber 值dbo.DestinationTable
如果记录不存在,它将被重定向到OLE DB Destination命名为 as Insert into destination table,它将行插入到dbo.DestinationTable
如果记录存在,它将被重定向到OLE DB Destination命名为Insert into staging table,它将行插入到dbo.StagingTable. 暂存表中的这些数据将用于第二个`Execute SQL Task 执行批量更新。

为了激活 OLE DB Source 的更多行,我运行了以下查询来激活一些记录
UPDATE dbo.SourceTable
SET IsActive = 1
WHERE (RowNumber % 9 = 1)
OR (RowNumber % 9 = 2)

包的第一次执行如下所示。所有行都被定向到目标表,因为它是空的。在我的机器上执行包大约需要3 seconds.


再次运行行计数查询以查找所有三个表中的行计数。

为了激活 OLE DB Source 的更多行,我运行了以下查询来激活一些记录
UPDATE dbo.SourceTable
SET IsActive = 1
WHERE (RowNumber % 9 = 3)
OR (RowNumber % 9 = 5)
OR (RowNumber % 9 = 6)
OR (RowNumber % 9 = 7)

包的第二次执行如下所示。314,268 rows之前在第一次执行期间插入的内容被重定向到临时表。628,766 new rows直接插入到目标表中。在我的机器上执行包大约需要12 seconds. 314,268 rows在第二个执行 SQL 任务中使用临时表更新了目标表中的数据。


再次运行行计数查询以查找所有三个表中的行计数。

我希望这能给你一个想法来实施你的解决方案。