ここからAccessを中心としたSSISによるデータ転送の例を説明していきます。
まずはじめのモデルケースは、SQL Server上のあるテーブルのデータを丸ごとAccess上のテーブルに転送する事例です。
ここでは、SQL Server上の「得意先」テーブルを、ほぼ同じデータ構造のAccessの「得意先」テーブルに転送するパッケージを作成します。なお、プロジェクトや、SQL
Serverへ接続するデータソースは「1.SQL Server Integration Servicesとは」ですでに作成されているものとしてその手順を説明します。
- まず、[プロジェクト]-[新しいSSISパッケージ]メニューを実行し、この処理用のパッケージを新規作成します。
- ここでは、ソリューションエクスプローラ上でパッケージの名前を「Case01.dtsx」に変更します(もちろんこの名前の付け方は任意です)。
- まず、ツールボックスから「SQL実行タスク」を選択して、デザイナ上へドラッグ&ドロップします。
- 次で説明する、データ転送処理を行うタスク「データフロータスク」は、転送先にレコードを追加します。常に転送先に転送元データを“追加”するような処理では必要ありませんが、両方のデータを同じレコード数にしたい場合には、事前に転送先のテーブルを空にする必要があります。そのためここでは、「SQL実行タスク」を使ってAccess側にDELETE文(Accessの場合)を発行し、既存レコードすべてを削除しておくものとします。
- 次に、データ転送処理を行うため、「データフロータスク」をツールボックスからデザイナ上へドラッグ&ドロップします。
- 処理のフローとして、まず「SQL実行タスク」を使ってテーブルを空にし、そのあと「データフロータスク」を使って転送処理を行います。その流れ(タスクの処理順序)を指示するため、「SQL実行タスク」の下にある緑色のコネクタを「データフロータスク」の方へドラッグ&ドロップし、ふたつのタスクを結合します。
- 次に、「SQL実行タスク」のプロパティを設定します。デザイナ上のタスクのボックスをダブルクリックするなどして、「SQL実行タスクエディタ」ダイアログを開きます。
- ダイアログが開いたら、まず「Connection」プロパティの入力欄の右にある[▼]をクリックして、「<新しい接続...>」選択します。
- 「OLE DB接続マネージャの構成」ダイアログが表示されたら、[新規作成]ボタンをクリックします。
- 「接続マネージャ」ダイアログが表示されたら、「プロバイダ」の一覧から「Microsoft Office 12.0 Access Database
Engine OLE DB Provider」を選択します。
なお、ここではAccess2007のファイル(.accdb)に対してデータを転送するものとしています。もしAccess2003以前のファイル(.mdb)に転送するような場合には「Microsoft
Jet 4.0 OLE DB Provider」を選択します。
- 「Microsoft Office 12.0 Access Database Engine OLE DB Provider」の場合には、「サーバー名またはファイル名」の欄に、データ転送先となるAccessのデータベースファイルをフルパスで指定します。
- もしアクセスするためにパスワードなどが必要であれば適宜指定します。
- 指定が完了したら、念のため[接続テスト]ボタンをクリックし、そのファイルに確かにアクセスできることを確認します。
- 接続マネージャでの設定が完了したら[OK]ボタンをクリックします。
それによって「OLE DB接続マネージャの構成」ダイアログの「データ接続」の欄にそれが追加されます。
- 次に、Accessの指定テーブルを空にするためのSQL文を「SQLStatement」プロパティの欄に直接書き込みます。ここでは「DELETE
* FROM 得意先」とします。
- リレーションシップの設定などによってテーブルのレコードを簡単に削除できないこともあります。根本的にそのSQL文を受け付けてくれない場合はSSISでもエラーとなります。パッケージ実行時にエラーとなったような場合には、そのSQL文をAccess上のクエリで直接的に発行してみて、間違いがないか試してみる必要があります。
- [OK]ボタンをクリックして設定を確定、「SQL実行タスクエディタ」ダイアログを閉じます。
- 次に、2つめのタスク「データフロータスク」の設定を行います。それにはデザイナの「データフロータスク」をダブルクリックします。
すると、SSISデザイナ上のアクティブなタブが「制御フロー」から「データフロー」に切り替わります。これはタスクによって異なりますが、「データフロータスク」の場合には設定用のダイアログが開くのではなく、この「データフロー」タブ上にそれ用のコンポーネントを配置することによって、転送元や転送先の設定を行います。
なお、デザイナのタブをクリックして直接アクティブタブを切り替えることもできます。
- 「データフロータスク」の場合、基本的な操作として、転送元と転送先のふたつのコンポーネントをデザイナ上に配置します。
まず、ツールボックスから「データフローの変換元」のカテゴリにある「OLE DBソース」コンポーネントをデザイナ上にドラッグ&ドロップします。
- タブを「データフロー」に切り替えると、自動的にツールボックスの中味が切り替わります。
- ツールボックスを見ると、ここではExcelやフラットファイル(テキストファイル)なども転送元として選択できることが想像できると思います。SQL
ServerやAccessは、「OLE DBソース」に位置付けされています。
- 今度は、転送先を設定するため、ツールボックスから「データフローの変換先」のカテゴリにある「OLE DB変換先」コンポーネントをデザイナ上にドラッグ&ドロップします。
- 転送元(ソース)から転送先(変換先)へとデータを流すことになりますので、その流れに合わせて「OLE DBソース」から「OLE DB変換先」へと緑色のコネクタをドラッグ&ドロップして両者を結合します。
- 次にそれぞれのコンポーネントの設定を行います。
まず「OLE DBソース」のコンポーネントをダブルクリックして「OLE DBソースエディタ」ダイアログを開きます。そして、このパッケージではまだSQL
Serverへの接続情報が設定されていませんので、それを作成するために[新規作成]ボタンをクリックします。
- 「OLE DB接続マネージャの構成」ダイアログが表示されたら、データ接続の一覧にあるSQL Serverへの接続情報を選択して[OK]ボタンをクリックします(SQL
Serverへの接続に関しては前回の手順で作成しており、かつ同じプロジェクトであるため、ここに選択肢として表示されます)。
- 「OLE DBソースエディタ」に戻ったら、次に、転送元となるテーブルを指定します。
「テーブル名またはビュー名」の欄の[▼]ボタンをクリックすると接続先のデータベース上のテーブル/ビューが検索され、一覧表示されますので、その中から選択します。
- テーブルやビューを指定したあと[プレビュー]ボタンをクリックすると、そこに保存されているデータの一部が表示され、内容を確認することができます。
- 次に、同じく「OLE DBソースエディタ」の左のリストから「列」をクリックして選択します。
それによって、指定されたテーブル/ビューにある列(フィールド)が表示されますので、転送先に出力する列・しない列をチェックマークの有無で指定します。
- 今回のサンプルではAccess側の「ID」フィールドはオートナンバー型となっており、SQL Server側から「ID」列を出力しようとするとエラーとなってしまいます。そのため、「ID」列についてはチェックを外して出力しないようにしています。もしIDも含めて転送したい場合には、Access側の作業用テーブルにいったん転送したあと、更新クエリなどを使って両者の整合性を取りながら本来のテーブルを更新するなどの後処理を行う必要があります。
- また、SQL ServerにないAccess固有のデータ型フィールドへの出力もエラーとなることがありますので、出力しないようにしたりテーブル構造そのものを見直したりする必要があります。
- 最後に「OLE DBソースエディタ」ダイアログの[OK]ボタンをクリックします。
これで転送元となる「OLE DBソース」の設定は完了です。
- この時点で、デザイナの下の「接続先マネージャ」のタブにはふたつの接続(SQL ServerとAccess)が表示されています。必須ではありませんが、ここでは分かりやすい名称に変えておきます。なおそれによって、OLE
DBソースエディタなどの接続先名も自動的に変わります。
- 続いて、「OLE DB変換先」コンポーネントをダブルクリックして「OLE DB変換先エディタ」ダイアログを開きます。
- ここではまず、接続マネージャを選択します。「SQLタスク」ですでにAccess側の接続が設定されていますので、[▼]ボタンをクリックして一覧から選択します。
- OLE DBソースと同様の操作で、データの転送先となるテーブルを選択します。
- 次に画面左のリストから「マッピング」を選択します。
ここでは、ソース側の各フィールドのデータを変換先のどのフィールドに出力するかをマッピングします。
両者のフィールド名が自動的に照合され、同じ名前のフィールドどうしが結合されています。もしそれでよければ、そのまま[OK]ボタンをクリックして設定を確定します。
もし“同じデータ内容だがフィールド名が異なっている”という場合には、Accessのクエリの結合線の要領で、マニュアルで両者の対応付けを行います。列名のドラッグ&ドロップで結合できます。また結合線を選択してDeleteキーで削除できます。また画面下半部の表でも関連付けを行うことができます。
以上で各タスクの設定が完了しましたので、パッケージを実行してみます。
ここでは「制御フロー」タブと「データフロー」タブにタスクやコンポーネントが配置されていますが、正常に処理されればどちらも緑色になります。
SQL ServerとAccessのテーブルを確認すると、次のようになっています。
補足
デザイナ上に配置されたタスクやコンポーネントはWordなどの図形とまったく同じ操作で大きさや位置を変えることができます。マニュアルでいろいろそれらを変更していると、全体として見づらい配置になってしまうこともあります。そのようなとき、[書式]メニューを使うことで、サイズや位置を自動調整したり、整列させたり、同じサイズに揃えたりすることができます。
|