TimberLandChapel's Tech Blog

TimberLandChapel provide Tips, tech note and scribbling.
Updated my site as English site for APAC users.
TLC.com .Metrix 4.0 Beta1 released

サイトの日本語化方法はこちら

Syndication

News

INETAJ

情報処理関係官公庁

SQL Server

TLC.com

Microsoft

クリエイティブ・コモンズ

http://www3.clustrmaps.com/
【SSIS Lightning】CSV ファイル内の異常データをエラーファイルにリダイレクトする
シナリオと要件

SSIS ではデータロード中に異常データが発生した場合にいくつかの対処をとることが可能です。
ここで異常データというデータには,その異常の深刻度について2段階が存在します。
エラーデータ 不正な型や,変換不能なデータなど深刻なエラーとして処理されるデータを言います。 切り捨てデータ 文字列において有効な桁数よりも入力データが大きい桁を持つデータ。エラーデータより深刻でないと取り扱われます。

さらに,異常データが発生した場合にとることのできる対処として,3段階の処理が存在します。
エラーコンポーネントによる処理 SSIS のエラー処理機能に処理を委譲します。SSIS エラー処理では,イベントハンドルによって高度なエラー処理を行うことが可能です。 行のリダイレクト 異常データを [エラー出力] に出力して,処理を続行します。正常なデータは定義された通常のロードに,異常データは特別に定義されたエラー出力に,2つの出力に分離されます。 エラーの無視 エラーデータを単純に無視して処理を続行します。

このトピックでは,エラーイベントに対応した追加タスクの組み方と,行のリダイレクトによる異常データの分離について解説します。

この記事は,
SQL Server 2005 Developer Edition Service Pack 1
Integration Services に基づいて記述しています。

行のリダイレクトによる異常データの分離

まずは,設定がシンプルな [行のリダイレクト] を使用します。
今回は,パッケージのトランザクション化で使用したパッケージを少し拡張して,エラーが発生する CSV ファイルの読み込みの動作を少し変更します。
このパッケージでは,CSV ファイルをフラットファイル接続で取得してロードしていますが,途中に異常なデータが存在するためにエラーになっています。

[フラットファイル ソース] の既定の動作では,異常なデータが発生した時点で処理が停止します。
これは,既定ではエラー処理が何も組まれていないことと,エラーの許容値が1に設定されているためです。

この動作を少し変えて,異常なデータは専用の異常データを保存するファイルにはじいて,正常なデータのみをロードするようにしてみましょう。

[フラットファイル ソース] から [OLE DB 変換先] へのパイプを作成する。

[フラットファイル ソース] の [フラットファイルソース エディタ] を開いて,[エラー出力] ペインで既定の状態を確認する。
それぞれの列の [エラー] と [切り捨て] の設定を [行のリダイレクト] に変更する。
エラー出力を保存する [フラットファイル 変換先] を作成する。
[フラットファイル ソース] のエラー出力を表す赤い矢印を [フラットファイル 変換先] に接続する。
[フラットファイル 変換先 エディタ] で [エラー出力列],[ErrorCode],[ErrorColumn] のデータマッピングを設定する。
[フラットファイル ソースのエラー出力] パイプが正しく接続されていることを確認する。

ここまでの作業を行うと,読み込む CSV データの異常データを,エラー出力先に分離する準備が整っています。
デバッグ実行を行うと,この例では異常データ1データが分離されて保存されています。

データフローの緑色の表示を見てわかるとおり,[行のリダイレクト] を行うと,
異常データは分離されて指定されたエラー出力に送信され,正常なデータは通常通りロードを続けるため
パッケージ全体の実行は正常終了するようになります

エラーイベントを利用して,パッケージを失敗させて異常データのみを分離する

[行のリダイレクト] を設定することで,異常なデータの分離は可能になりました。
しかし,[行のリダイレクト] では,正常なデータのみの読み込みが行われて,パッケージの実行が成功のステータスになってしまいます。
このため,ソースの中に異常なデータが存在した場合は,パッケージの実行を停止して,異常データは分離保存するといった要件に対応できません。

こういった場合は,[エラーコンポーネント] を介して,[イベントハンドラ] にエラーイベントを送信して,
エラー出力のみを記録する独自のデータフロータスクを構築するなどとします。

データパイプの基本構成は変わりません。
CSV フラットファイルからのロードを行って,途中に異常データが発生します。

[フラットファイルソース エディタ] で [エラー出力] が全て [エラーコンポーネント] になっていることを確認する。

[イベントハンドラ] タブで,[実行可能ファイル] ドロップダウンに該当の [データフロータスク] の名前を選択する。

[イベントハンドラ] ドロップダウンで [OnError] イベントを選択して,[イベントハンドラ] を作成する。

[イベントハンドラ] に 新しい [データフロータスク] を作成する。

異常データが含まれている [フラットファイル ソース] からのエラー出力を保存する [エラー出力] パイプを作成する。

[エラーコンポーネント] を経由し,エラーの許容値を1に設定していることから,
異常データを読み込んだ時点でパッケージは失敗のステータスとなり停止します
一方,エラーのイベントを受け取る [OnError] ハンドラが起動され,異常データの抽出が実行されます

この方法を用いることで,パッケージとしては失敗しつつ,異常データの抽出が行われるパッケージを実装できます。


  ヒント 
OnError 時の異常データの抽出について
このパッケージで使用した,エラーハンドラのポイントは,正常時のデータパイプを一切持たない,エラー出力のみのパイプを定義するところです。
こうすることによって,正常データは一切読み込まれずに,異常なデータだけを特定の変換先に保存しています。 

written by TimberLandChapel

Published 2006年7月15日 3:10 by timberlandchapel

Comments

# 【SSIS Lightning】SSIS ライトニングコンテンツに記事を追加しました。@ 2006年7月15日 3:15

SSIS ライトニングコンテンツに記事を追加しました。
CSV ファイル内の異常データをエラーファイルにリダイレクトするhttp://blogs.timberlandchapel.com/blogs/timberlandchapel/articles/889.aspx...