バッチ操作を使用して挿入または更新する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.StagingTable
Destination
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.DestinationTable
dbo.StagingTable
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
場合は、名前付きにリダイレクトされInsert into destination table
、行がに挿入されます。dbo.DestinationTable
レコードが存在するOLE DB Destination
場合は、という名前のにリダイレクトされInsert into staging table
、行がに挿入されdbo.StagingTable
ます。ステージングテーブルのこのデータは、2番目の`SQL実行タスクでバッチ更新を実行するために使用されます。
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つのテーブルすべての行数を見つけました。
それがあなたのソリューションを実装するためのアイデアを与えることを願っています。