モデルケース4では、Accessから出力されたCSVファイルをそのまま転送元として利用していました。そのため、データ変換コンポーネントを使った若干のデータ変換はありましたが、基本的にはそのままデータを転送できました。しかし、CSVファイルを他のソフトから出力してそれをAccessのテーブルに取り込むような場合、他のソフトの出力形式が特殊なものになっていることもあるかもしれません。
たとえば、日付のデータが「YYYYMMDD」のような8桁の文字列となっているような場合、「YYYY/MM/DD」のような形式に変換しないとAccess側の「日付/時刻型」フィールドに取り込むことができません。そのような変換はデータ変換コンポーネントによる単純な“データ型”変換では処理できませんので、CSVファイルのデータを1レコードずつ加工しながらAccessに転送するというフローを組む必要があります。
そこでここでは、日付データが「YYYYMMDD」形式のテキスト型データで保存されているCSVファイル(「商品2.csv」)の取り込みを例に、その方法を説明します。

- まず、ソリューションエクスプローラ上で「Case04.dtsx」のパッケージをコピーして「Case05.dtsx」を作ります。
- 接続先マネージャのウィンドウからCSVファイルへの接続をダブルクリックして「フラットファイル接続マネージャエディタ」ダイアログを開きます。
- パッケージをコピーしたので、接続先が「商品.csv」となっています。これを今回の転送元である「商品2.csv」に変更します。

- 次に画面左のリストから「列」を選択し、[リセット]ボタンをクリックします。そのあと、画面上のプレビューを確認し、「登録日」の列が追加されていることを確認します。
これは、やはり「商品.csv」のときの列設定がそのまま残っているためで、リセットすることによって「商品2.csv」の列構造をあらためて取り込むことができます。

- [OK]ボタンをクリックして「フラットファイル接続マネージャエディタ」ダイアログを閉じます。
- 次に「フラットファイルソース」コンポーネントをダブルクリックします。
すると、上記操作でフラットファイル接続マネージャに列がひとつ追加されているため、次のようなメッセージが表示されます。ここではそのまま[はい]をクリックします。

- 「フラットファイルソースエディタ」ダイアログが表示されたら、まず画面左のリストより「列」を選択します。
そして、CSVファイルから転送する列として今回追加された「登録日」にチェックマークが付いていることを確認し、[OK]ボタンをクリックします。

- 次に「データ変換」コンポーネントをダブルクリックして「データ変換 変換エディタ」ダイアログを開き、「登録日」にチェックマークを付け、入力列つまりフラットファイルソースから受け取る列として追加します。

- 次に「OLE DB変換先」コンポーネントをダブルクリックして「OLE DB変換先エディタ」ダイアログを開き、「マッピング」の画面で入力列と変換先列の「登録日」どうしを結合します。

- すべての設定が完了したら、実行してみます。
しかしここでは、「YYYYMMDD」形式のテキスト型データをAccessの日付/時刻型フィールドにそのまま転送しているので、転送(レコード追加)に失敗し「OLE
DB変換先」コンポーネントでエラーが発生します。
ここからがその対処方法です。「スクリプトコンポーネント」というコンポーネントを利用し、転送元から取り込んだデータを1件ずつ加工する処理をフローの中に追加します。
- まずツールボックスの「データフロー変換」カテゴリより「スクリプトコンポーネント」をデザイナ上にドラッグ&ドロップします。

- するとまず「スクリプトコンポーネントの種類を選択」ダイアログが表示されますので、ここでは「変換」を選択して[OK]ボタンをクリックします。

- 「スクリプトコンポーネント」がデザイナ上に挿入されたら、既存の緑色のコネクタをいったん削除して、「フラットファイルソース → スクリプトコンポーネント
→ データ変換」というフローになるよう、コネクタをつなぎ変えます。



- 次に「スクリプトコンポーネント」をダブルクリックして「スクリプト変換エディタ」ダイアログを開きます。
- 画面左のリストから「入力列」を選択し、「使用できる入力列」の先頭にある「名前」にチェックマークを付けます。これによってすべての列が入力列に指定されます。
さらに、「登録日」についてはこのスクリプトコンポーネント内でデータを編集しますので、画面下半分の表の「使用法の種類」欄を「ReadWrite」に変更します。

- 画面左のリストから「スクリプト」を選択し、これから作成するスクリプトの言語を「Visual Basic」と「Visual C#」のいずれかから選択したあと、[スクリプトの編集]ボタンをクリックします。

それによってSSISデザイナとはまったく別のウィンドウとして、スクリプト編集用の画面が開きます(外観あるいは機能としてはやはりVisual StudioのIDEと同じものです)。

- ここで、転送元のソースから1レコード読み込むたびにその内容を加工するためのスクリプト、すなわち「YYYYMMDD」の文字列を「YYYY/MM/DD」のように変換する(スラッシュ2つを付ける)ためのコードを書き込みます。
書き込み先は、「Public Overrides Sub 入力0_ProcessInputRow(ByVal Row As 入力0Buffer)」というプロシージャ内です。
このプロシージャは1レコード読み込まれるたびに呼び出されるもので、引数にあるように、Rowというオブジェクト変数に読み込み元の1件分のデータが保存されています。そして「Row.登録日」というような記述によって、所定のフィールドのデータにアクセスすることができます。
- ここでは、単純な文字列処理によって登録日の文字列の途中にふたつのスラッシュを挟み込み、それを同じ登録日に代入しています。
- ここでのプログラムの記法は、Visual Basic.NETに準じたものです。
- スクリプトの記述が完了したら、そのままそのウィンドウを閉じます。特にコンパイルや保存などの操作は必要ありません。
- 「スクリプト変換エディタ」に戻ったら[OK]ボタンをクリックして設定を確定します。
- あとでその内容を変更する場合も、「スクリプト変換エディタ」で[スクリプトの編集]ボタンをクリックします。
- スクリプトコンポーネントによって、テキスト型だった日付のデータがスラッシュを含む日付型に変換されるようになりましたので、それに合わせて、「データ変換」コンポーネントのエディタで「登録日」を「日付
[DT_DATE]」に変換するよう設定変更します。

- パッケージを実行してみます。今度は、エラーは発生せず正常終了しています。また出力先のAccessのテーブルにおいても、「YYYY/MM/DD」でデータが転送されていることが分かります。


補足
今回は簡単な例として「YYYYMMDD」から「YYYY/MM/DD」への変換だけを行いましたが、スクリプトコンポーネントでは.NETのプログラムを使うことができますので、関数、メソッド、フロー制御などを使ってさまざまな処理、複雑な処理を実行できます。たとえば、転送元と転送先のデータベースによってはTrue/Falseの形式が異なる場合がありますので、そのような変換も行えます(1をTrueとしたり-1をTrueとしたりなど)。またNull値や空白を所定の文字に変換したり、「*」のような記号の有無でTrue/Falseを切り替えたり、長い文字列から所定の部分を切り出したりといったことにも展開できます。
|