バッチ操作を使用して挿入または更新するSSIS2008R2を使用したサンプルパッケージ:
SSIS 2008 R2これは、バッチ操作を使用して2つのデータベース間で挿入、更新を実行する方法を示す、で記述されたサンプルパッケージです。
- を使用すると、バッチ操作が実行されない
OLE DB Commandため、パッケージの更新操作が遅くなります。すべての行は個別に更新されます。
Sourceこのサンプルでは、との2つのデータベースを使用しています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とという名前の2つのテーブルを作成しました。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に設定されています。

Sourceそれぞれがデータベースに接続する2つのOLEDB接続マネージャーを使用してSSISパッケージを作成しましたDestination。以下に示すように制御フローを設計しました。
まず、宛先データベースに対してExecute SQL Taskステートメントを実行して、ステージングテーブルを切り捨てます。TRUNCATE TABLE dbo.StagingTable
次のセクションでは、の構成方法について説明しData Flow Taskます。
次に、で使用可能なデータを使用してデータExecute SQL Taskを更新する以下のSQLステートメントを実行します。これらの2つのテーブル間で一致する一意のキーがあると想定します。この場合、一意のキーは列です。dbo.DestinationTabledbo.StagingTableRowNumber
更新するスクリプト:
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.SourceTableSQLコマンドを使用してデータを読み取りますSELECT RowNumber,CreatedOn, ModifiedOn FROM Source.dbo.SourceTable WHERE IsActive = 1
Lookup transformationRowNumber値がテーブルにすでに存在するかどうかを確認するために使用されますdbo.DestinationTable
レコードが存在しないOLE DB Destination場合は、名前付きにリダイレクトされInsert into destination table、行がに挿入されます。dbo.DestinationTable
レコードが存在するOLE DB Destination場合は、という名前のにリダイレクトされInsert into staging table、行がに挿入されdbo.StagingTableます。ステージングテーブルのこのデータは、2番目の`SQL実行タスクでバッチ更新を実行するために使用されます。
![[データフロー]タブ](https://i.stack.imgur.com/PQhcQ.png)
OLE DBソースの行をさらにいくつかアクティブ化するために、以下のクエリを実行していくつかのレコードをアクティブ化しました
UPDATE dbo.SourceTable
SET IsActive = 1
WHERE (RowNumber % 9 = 1)
OR (RowNumber % 9 = 2)

パッケージの最初の実行は次のようになりました。空だったため、すべての行が宛先テーブルに転送されました。私のマシンでのパッケージの実行には約がかかりました3 seconds。


行数クエリを再度実行して、3つのテーブルすべての行数を見つけました。

OLE DBソースの行をさらにいくつかアクティブ化するために、以下のクエリを実行していくつかのレコードをアクティブ化しました
UPDATE dbo.SourceTable
SET IsActive = 1
WHERE (RowNumber % 9 = 3)
OR (RowNumber % 9 = 5)
OR (RowNumber % 9 = 6)
OR (RowNumber % 9 = 7)

パッケージの2回目の実行は次のようになりました。314,268 rows最初の実行時に以前に挿入されたものは、ステージングテーブルにリダイレクトされました。628,766 new rows宛先テーブルに直接挿入されました。私のマシンでのパッケージの実行には約がかかりました12 seconds。314,268 rows宛先テーブルのは、2番目のSQL実行タスクでステージングテーブルを使用したデータで更新されました。


行数クエリを再度実行して、3つのテーブルすべての行数を見つけました。

それがあなたのソリューションを実装するためのアイデアを与えることを願っています。