SSIS プロジェクト: コントロールフローにタスクを追加

これまでに SSDT にてソリューションを作成し、SSIS プロジェクトを追加し、そこにデータソースへの接続情報を作成しました。

今回は SQL Server 内のデータベースからデータを取込み、BI 用のデータベースにデータをまとめ上げようとしています。

接続情報の作成方法は「SSIS プロジェクトのワークフローの定義」に記載しました。

ここでは、その接続を介して、データを取込み、保存するための ETL タスクを定義します。

「コントロールフロー」にタスクを定義

まずは SSIS プロジェクト内の "Control Flow" タブをクリックし選択します。

ここにどんどんタスクを定義していきます。詳細は後で設定するので、大まかな流れをメモしていく感覚で追加していくのがコツです。

左側の SSIS ツールボックスから、"Execute SQL Task" をドラッグアンドドロップします。

タスクの名前を変更します。ここでは何らかの初期化を行なう SQL ステートメントを実行することを想定しています。

次にデータを取り込むタスクである "Data Fow Task" を SSIS ツールボックスからドラッグアンドドロップします。

名前を変更します。ここでは Employee Table のデータを引いてくるので、"Load Employee Data Flow Task" としました。

同様に "Customer Data" (顧客データ)、"Order Data" (注文データ)、"Order Details" (注文明細) を取得するためのタスクを追加します。

"Format" メニューから "Vertical Spacing" > "Make Equal" を選択して、上下の幅を均等にして・・・

"Align" から中央で揃えるようにすると、きれいに並びます。

またタスクを選択すると、矢印(コネクタ)が表示されるので、上から順番に並べて繋げておきます。

後で出てきますが、SSIS パッケージを実行するとこのタスクが順番に実行されます。

Data Flow Task の設定

さて、詳細を省いてとりあえず「データを取り込む」という感じだけで追加した Data Flow Task ですが、それぞれに対してその内容を定義していきます。

"Data Flow" タブを選択すると、その下にドロップダウンリストがあり、この中に "Control Flow" で作成した "Data Flow" タスクが並んでいます。

では、ここでは "Load Employee Data Flow Task" を選び、その内容を定義しましょう。

やりたいことは "Northwind" データベース内の "Employees" テーブル内のレコードを取得して、 "NorthwindBI" データベース内の "Employees" テーブルに流し込むことです。この際、レポートに使わないフィールドは無視して、 必要なフィールド (ここでは EmployeeID, FirstName, LastName) のみを取り込みます。

さて、データの取込み元となる Northwind データベースは SQL Server なので、 SSIS Toolbox から "OLE DB Source" を選択して、Data Flow にドラッグアンドドロップします。

データの行き先 (Destination) も、SQL Server なので "OLE DB Destination" をドラッグアンドドロップします。

そしてそれらを矢印で結び、Source から Destination へ、という流れを定義します。

"OLE DB Source" をダブルクリックして "OLE DB Source Editor" を起動し、ここでデータの取込み元の情報を設定します。

データの流し込み先は同様に "OLE DB Destination Editor" にて定義します。

取込み先にはまだひとつもテーブルが定義されていないので、"New..." をクリックしてテーブルを定義します。

テーブル作成用の SQL 文が表示されますので、ここでテーブル名を決め、また、不要なフィールドを削除します。

ここでは単純に次のようなテーブルになりました。

OK を押して閉じると、このタイミングで "NorthwindBI" データベースにはテーブルが作成されます。

SQL Server Management Studio でみると、確かにテーブルができています。レコードは作成されていません。

左側でマッピング (Mappings) を選択して、データソースのカラムと取込み先のカラムが正しく関連付けされていることを確認します。

これでソースとディスティネーションが定義できました。

同様に Customers、Orders、Order Details テーブルについても同様に定義します。

ちなみに念のためお断りしておきますと、このスクリーンショットは "NorthwindBI" データベースにどのようなテーブルが作成されたかお見せするために、 SQL Server Management Studio の画面を一部切り貼りして作った画面です。厳密にこのような表示をする箇所はありません。

Execute SQL Task の設定

さて、残るは Control Flow の一番最初の初期化作業です。

今回は単純化のために、全レコードを削除して、取り込むという作業を実行します。

そこで、実行する SQL タスクとしては、テーブル内のレコードの全削除です。

SQL Task の編集画面内にて、接続情報をデータソースのデータベースではなく、 取込み先のデータベースを選択し・・・(データソースを消さないように気をつけてください)

"SQLStatement" を編集します。

右側に現れる "..." をクリックすると、クエリエディタが表示されます。

上記のように DELETE 文を入力し OK を押します。

以上でデータフロータスクと、Execute SQL Task の両方が設定できました。

SSIS パッケージの実行

ここで定義したワークフローは次の通りです。

これを SSDT 内で実行するには、SSIS のパッケージを実行します。

SSIS パッケージを右クリックして、表示されるコンテキストメニューで "Execute Package" (パッケージを実行) を選択します。

すると上から順に実行されていきます。右側に黄色のアイコンが付いているのが、現在実行中のタスクです。

完了すると緑色のチェックマークアイコンに変わります。

"Progress" タブに実行の詳細が記載されます。よく見ると最適化のヒントなどが記載されているので、ワーニングメッセージなどに従ってタスクを修正すると良いです。

SQL Server Management Studio でテーブル内のレコードを確認すると、確かに取り込まれていることがわかります。

以上でデータマイグレーションのワークフローが定義できました。

今回は SQL Server のデータベース間でデータを移しただけのデモですが、 実際には Excel のワークシートやフラットファイルからのデータ取込が発生することも多いです。

処理が複雑であればあるほど、様々なデータプロバイダに対応した SSIS は大変便利です。