モデルケース5では、CSVファイルの「登録日」は「YYYYMMDD」という定型的なフォーマットになっていました。そのため、あらかじめそのルールに従って変換すれば済みました。
しかしCSVファイルはテキストファイルですので、データ型を無視してデータを入力したり編集したり出来てしまいます。そのため、データ型に厳密なデータベースに取り込もうとするとエラーが発生する場合があります。
たとえば、数値型フィールドにアルファベットなどの文字を取り込もうとした場合、テキスト型や数値型フィールドのフィールドサイズをオーバーするような文字数・大きな数値を取り込もうとした場合、日付/時刻型フィールドに実在しない日付(11月31日など)を取り込もうとした場合などです。
タスクやコンポーネントのフローでは、デフォルトの設定ではそのようなエラーが発生すると以降のレコード処理や以降のタスクが実行されず、その時点でパッケージ処理が中止されます。そこでここでは、そのような可能性のある(ある程度エラーを予期できる)処理について、エラー発生時にも処理を続行させるためのエラー処理について説明します。
■エラーを無視して続行させる方法
まず、エラーが発生した場合そのレコードは無視して、以降のレコードのみ転送を続行させる方法です。それには、次のような設定を行います。
- ここではモデルケース5のパッケージを「Case06_1.dtsx」という名前でコピーして変更を加えるものとします。
- まずここでは、「登録日」に実在しない日付が保存されたCSVファイルを用意します。
- パッケージを実行します。
すると、「データ変換」コンポーネントでエラーが発生して処理が中止されます。

- そこでデバッグを停止したあと、「データ変換」コンポーネントをダブルクリックして「データ変換 変換エディタ」ダイアログを開きます。

- ダイアログで[エラー出力の構成]ボタンをクリックします。それによって「エラー出力の構成」ダイアログが開きます。

- ここからエラー発生時の処理を設定します。
まず、対象となる列の「エラー」の欄をすべて選択します。CtrlキーやShiftキーを押しながら欄をクリックすることで複数まとめて選択できます。

- 次に、画面下方の「選択したセルに設定する値」の欄で[▼]をクリックしてドロップダウンリストから「エラーを無視する」を選択したあと、その右の[適用]ボタンをクリックします。

- それによって画面上部の列の一覧の「エラー」欄がすべて「エラーを無視する」に変わっていることを確認します。
- 複数列まとめてではなく、それぞれの列ごとにエラー処理方法を設定することもできます。それには該当列の「エラー」欄で[▼]をクリックして項目を選択します。
- 「エラー出力の構成」ダイアログで[OK]ボタンを、さらに「データ変換 変換エディタ」ダイアログで[OK]ボタンをクリックしてダイアログを閉じます。
- パッケージを実行します。
今度はエラーが発生せず、最後までパッケージが実行されています。
- この設定の場合、「登録日」で変換エラーが発生したレコードについては、「登録日」フィールドにはNull値が書き出されます。
- 主キーなどの関係でレコードそのものが転送できない場合はレコード全体が無視されます。
■エラーレコードをファイル出力して続行させる方法
次に、エラーのないレコードだけを変換先テーブルに出力し、エラーが発生したレコードは別の所定のテキストファイルに出力した上でパッケージ全体の処理を続行させる方法です。それには、次のような設定を行います。
- ここでは前述の「Case06_1.dtsx」を「Case06_2.dtsx」という名前でコピーして変更を加えるものとします。
- 「データ変換」コンポーネントをダブルクリックして「データ変換 変換エディタ」ダイアログを開きます。
- [エラー出力の構成]ボタンをクリックして「エラー出力の構成」ダイアログを開きます。
- すべての列の「エラー」の欄を選択して、その設定を「行のリダイレクト」に変更します。

- 「エラー出力の構成」ダイアログで[OK]ボタンを、さらに「データ変換 変換エディタ」ダイアログで[OK]ボタンをクリックしてダイアログを閉じます。
- ここから、エラーのあったレコードを所定のファイルに出力するための設定です。
まずツールボックスから「フラットファイル変換先」コンポーネントをデザイン上にドラッグ&ドロップします。

- エラーが発生した場合のフローを設定するため、「データ変換」コンポーネントを選択し、その下に表示された「赤いコネクタ」を「フラットファイル変換先」へドラッグ&ドロップします。

- それによって「エラー出力の構成」ダイアログが表示されますが、そのまま[OK]ボタンをクリックします。

- 赤いコネクタが結合されたことを確認して、今度は「フラットファイル変換先」コンポーネントをダブルクリックします。
- 「フラットファイル変換先エディタ」ダイアログが開いたら、この時点ではまだエラー内容を出力するファイルへの接続が設定されていませんので、[新規作成]ボタンをクリックしてその作業を行います。
- この画面で「ファイル内のデータを上書きする」にチェックを付けておくと、パッケージを実行するたびにファイルが初期化されます。チェックを付けない場合には、実行するたびにエラーデータが“追加”されます。
- まず「フラットファイル形式」ダイアログが表示されますので、ここではCSVファイルに出力するものとして「区切り記号」を選択して[OK]ボタンをクリックします。

- 「フラットファイル接続マネージャエディタ」ダイアログが表示されたら、接続マネージャの名前やエラーを出力するファイルのフルパス、見出し行の有無などを設定して[OK]ボタンをクリックします。
- このダイアログで「詳細設定」の画面に切り替えると、列の一覧の中に「ErrorCode」と「ErrorColumn」という列が含まれています。このことから、エラーの出力先ファイルには自動的にエラーコードなども出力できることが分かります。
- 「フラットファイル変換先エディタ」に戻ったら「マッピング」の画面に切り替えて、転送元データのうちどのフィールドをエラー用のファイルに出力するかの関連付けを確認します。必要であれば対象フィールドの削除などもここで行います。

- 最後に[OK]ボタンをクリックします。

- パッケージを実行してみます。
デザイナ上の実行結果を見てみると、CSVのテストデータの中には3件のエラーとなるはずのレコードが含まれていますので、全30件のうち27件が正しくOLE
DB変換先に出力され、3件がエラー用のフラットファイルに出力されていることが分かります。

このとき、エラー出力用のファイルは次のようになっています。
- この方法では、「エラーを無視して続行させる方法」のようにエラーのあったレコードは「登録日」がNull値で書き出されることはなく、レコード全体が転送対象から除外されます(「転送元のレコード数−エラーレコード数」が出力されます)。
- ここではエラーレコードの出力先をフラットファイル(CSVファイル)としましたが、他のコンポーネント(「OLE DB変換先」など)を使うことで、AccessやSQL
Server等のテーブルに出力することでもできます。
|