使用批量操作插入或更新的 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配置。
 
- Second- Execute 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 Source- dbo.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 任务中使用临时表更新了目标表中的数据。


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

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