Integration Services パッケージでの MERGE の使用
SQL Server 2008 Integration Services (SSIS) では、SQL 実行タスクの SQL ステートメントに MERGE ステートメントを含めることができます。この MERGE ステートメントを使用すると、1 つのステートメントで複数の INSERT、UPDATE、および DELETE 操作を実行できます。
通常、MERGE ステートメントは、挿入、更新、および削除を含む変更をあるテーブルから別のテーブルに適用する場合に使用します。SQL Server 2008 より前のバージョンでこの処理を行うには、参照変換と複数の OLE DB コマンド変換の両方が必要でした。参照変換で、1 行ずつ参照を実行して各行が新しいか変更されたかを判断し、次に、OLE DB コマンド変換で、必要な INSERT、UPDATE および DELETE の操作を実行しました。SQL Server 2008 では、1 つの MERGE ステートメントを、参照変換と対応する OLE DB コマンド変換に代わって使用できます。
パッケージで MERGE ステートメントを使用するには、次の手順を実行します。
一時テーブルまたはステージング テーブルへのソース データの読み込み、変換、保存を実行するデータ フロー タスクを作成します。
MERGE ステートメントを含む SQL 実行タスクを作成します。
データ フロー タスクを SQL 実行タスクに接続し、ステージング テーブルのデータを MERGE ステートメントへの入力として使用します。
注 このシナリオでは、一般に、MERGE ステートメントにステージング テーブルが必要ですが、MERGE ステートメントのパフォーマンスは、通常、参照変換で実行される 1 行ずつの参照のパフォーマンスを上回ります。また、MERGE は、大きなサイズの参照テーブルが参照変換でその参照テーブルをキャッシュするために使用できるメモリをテストする場合にも役立ちます。
このトピックの残りの部分では、MERGE ステートメントの別の使用方法について説明します。MERGE 操作を使用する方法の詳細と例については、「MERGE を使用したデータの挿入、更新、および削除」を参照してください。
MERGE ステートメントの使用をサポートする変換先コンポーネントのサンプルについては、CodePlex コミュニティのサンプル (MERGE Destination) を参照してください。
増分読み込みを伴う MERGE の使用
Change Data Capture 機能は SQL Server 2008 の新機能で、これを使用すると、データ ウェアハウスへの増分読み込みを簡単に実行できます。パラメーター化された OLE DB コマンド変換を使用して挿入と更新を実行する代わりに、MERGE ステートメントを使用して両方の操作を組み合わせることができます。
詳細については、「変換先への変更の適用」を参照してください。
他のシナリオでの MERGE の使用
次のシナリオでは、MERGE ステートメントを Integration Services パッケージの内部でも外部でも使用できます。ただし、Integration Services パッケージは、多くの場合、このデータを複数の異種ソースから読み込み、データを結合および消去する際に必要になることがあります。したがって、メンテナンスを都合に合わせて簡単に行えるように、パッケージ内では MERGE ステートメントを使用することを検討してください。
購買習慣の追跡
データ ウェアハウスの FactBuyingHabits テーブルでは、各顧客が特定の製品を最後に購入した日付を追跡しています。このテーブルは、ProductID、CustomerID、および PurchaseDate の各列で構成されています。トランザクション データベースは、毎週、その週に行われた購入を記録する PurchaseRecords テーブルを生成します。1 つの MERGE ステートメントを使用して PurchaseRecords テーブルの情報を FactBuyingHabits テーブルにマージすることが目的です。製品と顧客の組み合わせが存在しない場合は、MERGE ステートメントによって新しい行が挿入されます。製品と顧客の組み合わせが存在する場合は、MERGE ステートメントによって最新の購入日が更新されます。
価格履歴の追跡
DimBook テーブルは、書店の在庫にある書籍の一覧を表し、各書籍の価格履歴を示しています。このテーブルには、ISBN、ProductID、Price、Shelf、および IsCurrent の各列が含まれています。また、このテーブルでは、書籍の価格が変更されるたびに 1 行追加されます。こうした行の 1 つに、現在の価格が含まれています。現在の価格が含まれている行を示すために、その行の IsCurrent 列の値は 1 に設定されます。
データベースは、毎週、その週の価格変更と、その週に追加された新しい書籍を記録する WeeklyChanges テーブルを生成します。1 つの MERGE ステートメントを使用して、WeeklyChanges テーブルの変更を DimBook テーブルに適用できます。MERGE ステートメントにより、新しく追加された書籍用に新しい行が挿入され、価格が変更された既存の書籍の行では IsCurrent 列が 0 に更新されます。また、価格が変更された書籍用に新しい行が挿入され、その行では 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 テーブルからその製品の行も削除されます。
|