【SSIS Lightning】CSV ファイル内の異常データをエラーファイルにリダイレクトする
シナリオと要件
SSIS ではデータロード中に異常データが発生した場合にいくつかの対処をとることが可能です。
ここで異常データというデータには,その異常の深刻度について2段階が存在します。
エラーデータ
不正な型や,変換不能なデータなど深刻なエラーとして処理されるデータを言います。
切り捨てデータ
文字列において有効な桁数よりも入力データが大きい桁を持つデータ。エラーデータより深刻でないと取り扱われます。
さらに,異常データが発生した場合にとることのできる対処として,3段階の処理が存在します。
エラーコンポーネントによる処理
SSIS のエラー処理機能に処理を委譲します。SSIS エラー処理では,イベントハンドルによって高度なエラー処理を行うことが可能です。
行のリダイレクト
異常データを [エラー出力] に出力して,処理を続行します。正常なデータは定義された通常のロードに,異常データは特別に定義されたエラー出力に,2つの出力に分離されます。
エラーの無視
エラーデータを単純に無視して処理を続行します。
このトピックでは,エラーイベントに対応した追加タスクの組み方と,行のリダイレクトによる異常データの分離について解説します。
この記事は,
SQL Server 2005 Developer Edition Service Pack 1
Integration Services に基づいて記述しています。
行のリダイレクトによる異常データの分離
まずは,設定がシンプルな [行のリダイレクト] を使用します。
今回は,パッケージのトランザクション化で使用したパッケージを少し拡張して,エラーが発生する CSV ファイルの読み込みの動作を少し変更します。
このパッケージでは,CSV ファイルをフラットファイル接続で取得してロードしていますが,途中に異常なデータが存在するためにエラーになっています。
[フラットファイル ソース] の既定の動作では,異常なデータが発生した時点で処理が停止します。
これは,既定ではエラー処理が何も組まれていないことと,エラーの許容値が1に設定されているためです。
この動作を少し変えて,異常なデータは専用の異常データを保存するファイルにはじいて,正常なデータのみをロードするようにしてみましょう。
1 [フラットファイル ソース] から [OLE DB 変換先] へのパイプを作成する。
2 [フラットファイル ソース] の [フラットファイルソース エディタ] を開いて,[エラー出力] ペインで既定の状態を確認する。
3 それぞれの列の [エラー] と [切り捨て] の設定を [行のリダイレクト] に変更する。
4 エラー出力を保存する [フラットファイル 変換先] を作成する。
5 [フラットファイル ソース] のエラー出力を表す赤い矢印を [フラットファイル 変換先] に接続する。
6 [フラットファイル 変換先 エディタ] で [エラー出力列],[ErrorCode],[ErrorColumn] のデータマッピングを設定する。
7 [フラットファイル ソースのエラー出力] パイプが正しく接続されていることを確認する。
ここまでの作業を行うと,読み込む CSV データの異常データを,エラー出力先に分離する準備が整っています。
デバッグ実行を行うと,この例では異常データ1データが分離されて保存されています。
データフローの緑色の表示を見てわかるとおり,[行のリダイレクト] を行うと,
異常データは分離されて指定されたエラー出力に送信され,正常なデータは通常通りロードを続けるため
パッケージ全体の実行は正常終了するようになります。
エラーイベントを利用して,パッケージを失敗させて異常データのみを分離する
[行のリダイレクト] を設定することで,異常なデータの分離は可能になりました。
しかし,[行のリダイレクト] では,正常なデータのみの読み込みが行われて,パッケージの実行が成功のステータスになってしまいます。
このため,ソースの中に異常なデータが存在した場合は,パッケージの実行を停止して,異常データは分離保存するといった要件に対応できません。
こういった場合は,[エラーコンポーネント] を介して,[イベントハンドラ] にエラーイベントを送信して,
エラー出力のみを記録する独自のデータフロータスクを構築するなどとします。
データパイプの基本構成は変わりません。
CSV フラットファイルからのロードを行って,途中に異常データが発生します。
1 [フラットファイルソース エディタ] で [エラー出力] が全て [エラーコンポーネント] になっていることを確認する。
2 [イベントハンドラ] タブで,[実行可能ファイル] ドロップダウンに該当の [データフロータスク] の名前を選択する。
3 [イベントハンドラ] ドロップダウンで [OnError] イベントを選択して,[イベントハンドラ] を作成する。
4 [イベントハンドラ] に 新しい [データフロータスク] を作成する。
5 異常データが含まれている [フラットファイル ソース] からのエラー出力を保存する [エラー出力] パイプを作成する。
[エラーコンポーネント] を経由し,エラーの許容値を1に設定していることから,
異常データを読み込んだ時点でパッケージは失敗のステータスとなり停止します。
一方,エラーのイベントを受け取る [OnError] ハンドラが起動され,異常データの抽出が実行されます。
この方法を用いることで,パッケージとしては失敗しつつ,異常データの抽出が行われるパッケージを実装できます。
ヒント
OnError 時の異常データの抽出について
このパッケージで使用した,エラーハンドラのポイントは,正常時のデータパイプを一切持たない,エラー出力のみのパイプを定義するところです。
こうすることによって,正常データは一切読み込まれずに,異常なデータだけを特定の変換先に保存しています。
written by TimberLandChapel