統合サービス パッケージの MERGE

適用対象:SQL Server Azure Data Factory の SSIS 統合ランタイム

SQL Server Integration Servicesの現在のリリースでは、SQL 実行タスクの SQL ステートメントに MERGE ステートメントを含めることができます。 この MERGE ステートメントを使用すると、1 つのステートメントで複数の INSERT、 UPDATE、および DELETE 操作を実行できます。

パッケージで MERGE ステートメントを使用するには、次の手順に従います。

  • 一時テーブルまたはステージング テーブルへのソース データの読み込み、変換、保存を実行するデータ フロー タスクを作成します。

  • MERGE ステートメントを含む SQL 実行タスクを作成します。

  • Data Flow タスクを SQL 実行タスクに接続し、ステージング テーブルのデータを MERGE ステートメントの入力として使用します。

    MERGE ステートメントでは通常、このシナリオではステージング テーブルが必要ですが、通常、MERGE ステートメントのパフォーマンスは、ルックアップ変換によって実行される行ごとの参照のパフォーマンスを超えています。 MERGE は、参照テーブルの大きなサイズで参照テーブルをキャッシュするために参照変換で使用できるメモリをテストする場合にも役立ちます。

MERGE の使用

通常、挿入、更新、削除を含む変更をテーブル間で適用する場合は、 MERGE ステートメントを使用します。 SQL Server 2008 (10.0.x) より前のバージョンでこの処理を行うには、参照変換と複数の OLE DB コマンド変換の両方が必要でした。 参照変換で、1 行ずつ参照を実行して各行が新しいか変更されたかを判断し、 OLE DB コマンド変換では、必要な INSERT、 UPDATE、および DELETE 操作が実行されました。 SQL Server 2008 (10.0.x) 以降では、参照変換と対応する OLE DB コマンド変換の両方を 1 つのMERGE ステートメントで置き換えることができます。

増分読み込みを使用した MERGE

Change Data Capture 機能は SQL Server 2008 (10.0.x) の新機能で、これを使用すると、データ ウェアハウスへの増分読み込みを簡単に実行できます。 パラメーター化された OLE DB コマンド変換を使用して挿入と更新を実行する代わりに、 MERGE ステートメントを使用して両方の操作を組み合わせることができます。

詳細については、「対象に変更を適用する」を参照してください。

その他のシナリオにおける MERGE

次のシナリオでは、Integration Services パッケージの外部または内部で MERGE ステートメントを使用できます。 ただし、 Integration Services パッケージは、多くの場合、このデータを複数の異種ソースから読み込み、データを結合および消去する際に必要になることがあります。 そのため、パッケージ内で MERGE ステートメントを使用して、保守を容易にすることを検討してください。

購買習慣の追跡

データ ウェアハウスの FactBuyingHabits テーブルでは、各顧客が特定の製品を最後に購入した日付を追跡しています。 このテーブルは、ProductID、CustomerID、および PurchaseDate の各列で構成されています。 トランザクション データベースは、毎週、その週に行われた購入を記録する PurchaseRecords テーブルを生成します。 目的は、単一の MERGE ステートメントを使用して、PurchaseRecords テーブル内の情報を FactBuyingHabits テーブルにマージすることです。 製品と顧客のペアが存在しない場合、 MERGE ステートメントは新しい行を挿入します。 存在する製品と顧客のペアの場合、 MERGE ステートメントは最新の購入日を更新します。

価格履歴の追跡

DimBook テーブルは、書店の在庫にある書籍の一覧を表し、各書籍の価格履歴を示しています。 このテーブルには、ISBN、ProductID、Price、Shelf、および IsCurrent の各列が含まれています。 また、このテーブルでは、書籍の価格が変更されるたびに 1 行追加されます。 こうした行の 1 つに、現在の価格が含まれています。 現在の価格が含まれている行を示すために、その行の IsCurrent 列の値は 1 に設定されます。

データベースは、毎週、その週の価格変更と、その週に追加された新しい書籍を記録する WeeklyChanges テーブルを生成します。 1 つの MERGE ステートメントを使用すると、WeeklyChanges テーブルの変更を DimBook テーブルに適用できます。 MERGEステートメントは、新しく追加された書籍の新しい行を挿入し、価格が変更された既存の書籍の行の IsCurrent 列を 0 に更新します。 MERGEステートメントでは、価格が変更された書籍の新しい行も挿入され、これらの新しい行では IsCurrent 列の値が 1 に設定されます。

新しいデータを含むテーブルと古いテーブルのマージ

データベースは、"オープン スキーマ"、つまり、各プロパティの名前と値の組み合わせが格納されているテーブルを使用して、オブジェクトのプロパティをモデル化します。 Properties テーブルには EntityID、PropertyID、および Value という 3 つの列があります。 NewProperties テーブルは、Properties テーブルと同期する必要のある、新しいバージョンのテーブルです。 これら 2 つのテーブルを同期するには、1 つの MERGE ステートメントを使用して、次の操作を実行できます。

  • Properties テーブルから、NewProperties テーブルに存在しないプロパティを削除します。

  • Properties テーブルに存在するプロパティの値を、NewProperties テーブルにある新しい値で更新します。

  • NewProperties テーブルに存在して Properties テーブルにはないプロパティについては、新しいプロパティを挿入します。

この方法は、レプリケーション シナリオのようなシナリオで役立ちます。この場合は、2 つのサーバー上の 2 つのテーブル内のデータを同期しておくことが目的です。

在庫の追跡

Inventory データベースには、ProductID 列と StockOnHand 列を含む ProductsInventory テーブルがあります。 ProductID、CustomerID、および Quantity の各列を含む Shipments テーブルでは、顧客に対する製品の出荷を追跡しています。 ProductInventory テーブルは、Shipments テーブルの情報に基づいて毎日更新する必要があります。 1 つの MERGE ステートメントを使用すると、ProductInventory テーブルの在庫を、出荷に基づいて削減できます。 製品の在庫が 0 に減少した場合、その MERGE ステートメントは ProductInventory テーブルからその製品行を削除することもできます。