2013年3月20日水曜日

◆エラーコンポーネントの利用

作成するパッケージの概要
作成するパッケージの概要

この STEPでは、データ転送時に起こりがちな、転送元のデータにイレギュラーな値が入っていた場合に発生するエラーの対処方法について説明します。前の Step で作成したエラーの発生するパッケージ(SSISoyo2 プロジェクト)を利用して、エラーの対処方法を試していきます。

SSISoyo2 プロジェクトの内容

この Step の実習を行うには、事前に Step3 と Step4 を行い、SSISoyo2 プロジェクトを作成しておく必要があります。SSISoyo2 プロジェクトのパッケージは、次のようなテキスト ファイル(タブ区切り)のデータを SQL Server へ転送し、データ型のエラー(文字と数値が混在している場合のエラー)を発生させるものです。

転送するファイル

image

作成するパッケージ

この Step では、SSISoyo2 プロジェクトを、次のように変更していきます。

image

SSISoyo2 プロジェクトの動作確認
SSISoyo2 プロジェクトの動作確認(エラーが発生することの確認)

まずは、前の Step で作成した SSISoyo2 プロジェクトのパッケージを実行して、動作確認をします。

  1. パッケージの実行結果を確認しやすくするために、転送先の ssisdb3 データベース内にある ABC テーブルを一度空にしておきます。
    image
  2. 次に、パッケージの[データ フロー]タブを開いてから、デバッグを実行します。
    image
    配置している[フラット ファイル ソース]が実行中に変わって、前の Step で作成した OnError イベント ハンドラーが実行されて、エラー番号とエラーの説明がメッセージ ボックスで表示されることを確認できます。
    このメッセージ ボックスは、エラー(OnError イベント)が発生した数の分だけ表示されるので、その分[OK]ボタンをクリックします。
  3. すべてのメッセージ ボックスが表示され、[フラット ファイル ソース]がエラーになって、転送が失敗したことを確認できます。
    image
    確認後、デバッグを終了します。
  4. 次に、Management Studio から、[ABC]テーブルを右クリックして、[上位 1000 行の選択]をクリックし、データを確認します。
    image
    データ転送が失敗しているので、MISS.txt ファイルのデータは追加されていないことを確認できます。
エラーを無視する
エラーを無視する

SSIS パッケージには、データ転送時にエラーが発生した場合でも、エラーを無視してデータ転送を続行させる機能があります。それでは、これを試してみましょう。

  1. エラーを無視させるには、次のように配置した[フラット ファイル ソース]をダブル クリックして[フラット ファイル ソース エディター]ダイアログを表示します。
    image
  2. このダイアログでは、次のように[エラー出力]ページをクリックして、[列0]の[エラー]ドロップダウン リストを「エラーを無視する」へ変更し、[OK]ボタンをクリックします。
    image
  3. エラーが無視されることを確認するために、パッケージをデバッグ実行します。
    image
    エラーが無視されることを確認するために、パッケージをデバッグ実行します。
    今度は、すべてのコンポーネントに緑のチェックマークが付いて、データ転送が成功していることを確認できます。
  4. 確認後、デバッグを終了します。
  5. 転送されたデータを確認するために、Management Studio から、「ABC」テーブルを右クリックして、[上位 1000 行の選択]をクリックします。
    image
    MISS.txt のデータが追加されていることを確認できますが、「列0」列の文字データは「NULL」として追加され、正しいデータ(7, ZZZZ)はきちんと転送されていることを確認できます。
    image

 

エラー情報をファイルへ書き込む
エラー情報をファイルへ書き込む

次に、「列0」でエラーが発生したときのエラー情報(エラーが発生した行データとエラー情報)をファイルへ書き込むようにパッケージを変更してみましょう。

  1. エラー情報をファイルへ書き込むようにするには、次のように SSIS ツールボックスから[その他の変換先]カテゴリにある[フラット ファイル変換先]をドラッグ&ドロップして配置します。
    image
  2. 次に、[フラット ファイル ソース]でエラーが発生した場合に、[フラット ファイル変換先]へ転送されるように、次のように[フラット ファイル ソース]をクリックして表示される "赤い矢印" を[フラット ファイル変換先]まで伸ばします。
    image
    これにより、[エラー出力の構成]ダイアログが表示されるので、[列0]の[エラー]列を「エラーを無視する」から「行のリダイレクト」へ変更します。これで、「列0」列でエラーが発生した場合に、エラー情報を別のコンポーネントへリダイレクト(転送)できるようになります。
  3. 次に、[フラット ファイル変換先]をダブル クリックして、リダイレクトされたエラー情報を書き込むファイルを設定します。
    image
    [フラット ファイル変換先エディター]ダイアログが表示されたら、[新規作成]ボタンをクリックします。
  4. これにより、次のように[フラット ファイル形式]ダイアログが表示されて、書き込むファイルの書式を問われるので、「区切り記号」(カンマ区切り)が選択されていることを確認して、[OK]ボタンをクリックします。
    image
  5. 次に、[フラット ファイル接続マネージャー エディター]ダイアログが表示されるので、今回は、次のように[接続マネージャー名]へ「エラー情報の書き込み_errOut」、[ファイル名]へ「C:\errOut.txt」と入力して、[OK]ボタンをクリックします。
    image
  6. [フラット ファイル変換先エディター]ダイアログへ戻ったら、[マッピング]ページをクリックして、ファイルへ書き込むデータのマッピングを設定します。
    image
    受け取るデータ(使用できる入力列)には、[フラット ファイル ソースのエラー出力列](エラーが発生した該当行)と、[ErrorCode](エラー番号)、[ErrorColumn](エラー列)があり、エラーに関する情報が転送されてくることを確認できます。この転送されたデータをそのままファイルへ書き込むように、各列が線で結ばれている(マッピングされている)ことを確認して、[OK]ボタンをクリックします。
  7. ここまでの設定を確認するために、パッケージをデバッグ実行します。
    image
    すべてのコンポーネントに緑のチェックマークが付いて、データ転送が成功していることを確認できます。また、青色の矢印(成功時の処理)には「1 行」、赤色の矢印(エラー時の処理)には「2 行」と表示されて、成功が 1 行、エラーが 2 行であったことを確認することができます。
  8. 確認後、デバッグを終了します。
  9. 転送されたデータを確認するには、Management Studio から、「ABC」テーブルを右クリックして、[上位 1000 行の選択]をクリックします。
    image
    今度は、正しいデータのみが追加され、エラーが発生した行は追加されていないことを確認できます。
  10. 次に、Windows エクスプローラーから C:\errOut.txt ファイルを開き、エラー情報を取得できたかどうかを確認します。
    image
    エラーが発生した該当行がそのまま格納され、カンマで区切られてエラー番号を取得できていることを確認できます。
スクリプト コンポーネント(C#)によるエラー メッセージの取得
スクリプト コンポーネントによるエラー メッセージの取得

ここまでの手順では、「列0」列のエラー発生時に「エラー行」と「エラー番号」をファイルへ書き込むことができましたが、エラー番号だけではどういったエラーなのかがよく分かりません。そこで、エラー番号をもとにエラー メッセージを取得するようにパッケージを変更して、エラーの内容を分かりやすくしてみましょう。これを行うには、スクリプト コンポーネントを利用します。
それでは、これを試してみましょう。

  1. まずは、スクリプト コンポーネントを配置する前の作業として[フラット ファイル ソース]から[フラット ファイル変換先]へ伸びている「赤い矢印」を右クリックして、[削除]をクリックし、削除しておきます。
    image
  2. 次に、SSIS ツールボックスから[共通]カテゴリの[スクリプト コンポーネント]をドラッグ&ドロップして[フラット ファイル変換先]の上部へ配置します。
    image
    これにより、[スクリプト コンポーネントの種類を選択]ダイアログが表示されるので、[変換]が選択されていることを確認して、[OK]ボタンをクリックします。
  3. 次に、[フラット ファイル ソース]をクリックして表示される赤い矢印を[スクリプト コンポーネント]まで伸ばします。
    image
    これにより、[エラー出力の構成]ダイアログが表示されるので、「列0」列のエラーの情報を取得できるようにするために、「列0」の[エラー]列が「行のリダイレクト」になっていることを確認して、[OK]ボタンをクリックします。
  4. 次に、[スクリプト コンポーネント]をダブル クリックします。
    image
  5. [スクリプト変換エディター]ダイアログが表示されたら、[入力列]ページをクリックして開き、[ErrorCode]にチェック マークをつけます。
    image
    これにより、エラー発生時に[フラット ファイル ソース]からエラー番号を取得できるようになります。
  6. 続いて、取得したエラー番号からエラー メッセージを取得するための列を追加します。[入力および出力]ページをクリックし、[出力0]を展開して[出力列]フォルダーを選択した状態で、[列の追加]ボタンをクリックします。
    image
  7. すると、次のように追加する列の名前を入力できるようになるので、今回は「ErrDesc」と入力します。
    image
    右側のプロパティ画面では、[DataType]を「文字列 [DT_STR]」、[Length]を「100」へ変更します。
  8. 続いて、エラーの説明を取り出すスクリプトを記述するために、次のように[スクリプト]ページをクリックして、[スクリプトの編集]ボタンをクリックします。
    image
  9. これにより、「スクリプト エディター」が起動されるので、「public override void 入力0_ProcessInputRow(~)」内に、次のコード(C#)を入力します。
    Row.ErrDesc = this.ComponentMetaData.GetErrorDescription(Row.ErrorCode);

    image
    このコード内の Row は、今まさに処理をしている該当行を意味しています。「Row.ErrorCode」と指定することで、前の手順で受け取った ErrorCode 列のデータ(エラー発生時のエラー番号)を取得でき、「GetErrorDescription」メソッドへこの番号を与えることで、エラー番号に対応したエラーの説明(エラー メッセージ)を取得できるようになります。また、「Row.ErrDesc」は、前の手順で作成した「ErrDesc」列で、この列へエラー メッセージを代入するという意味です。なお、Visual Basic でコードを記述する場合は、「this」を「Me」へ変更して、最後のセミコロン(;)を削除します。
    入力後、保存してスクリプト エディターを閉じます。
  10. [スクリプト変換エディター]ダイアログへ戻ったら、[OK]ボタンをクリックして閉じます。
  11. スクリプト コンポーネントで取得したエラーの説明をファイルへ書き込むようにするために、次のように[スクリプト コンポーネント]の青色の矢印を[フラット ファイル変換先]まで伸ばします。続いて、[フラット ファイル変換先]をダブル クリックします。
    image
    これにより、[フラット ファイル変換先エディター]ダイアログが表示されるので、[新規作
    成]ボタンをクリックします。
    image
  12. [フラット ファイル形式]ダイアログが表示されたら、[区切り記号](カンマ区切り)が選択されていることを確認して、[OK]ボタンをクリックします。
    image
  13. 次に、[フラット ファイル接続マネージャー エディター]ダイアログが表示されるので、今回は[接続マネージャー名]へ「エラーの説明を書き込む_errOut2」とし、[ファイル名]へ「C:\errOut2.txt」と入力します。
    image
  14. 続いて、[詳細設定]ページをクリックして、列のプロパティを確認します。
    image
    [ErrDesc]列を選択して、前の手順で設定したように、[DataType]が「文字列」で、[OutputColumnWidth]が「100」となっていることを確認し、[OK]ボタンをクリックします。
  15. [フラット ファイル変換先エディター]ダイアログへ戻ったら、[マッピング]ページをクリックして、ファイルへ書き込むデータのマッピングを設定します。
    image
    [使用できる入力列]の「ErrDesc」列を、[使用できる変換先列]の「ErrDesc」列へドラッグ&ドロップして、スクリプト コンポーネントで取得したエラー メッセージをファイルへ書き込むようにします。
  16. パッケージをデバッグ実行して、ここまでの設定を確認します。
    image
    すべてのコンポーネントに緑のチェックマークが付いて、データ転送が成功したことを確認できます。
  17. 確認後、デバッグを終了します。
  18. 転送されたデータを確認するために、Management Studio から、[ABC]テーブルを右クリックして、[上位 1000 行の選択]をクリックします。
    image
  19. 次に、エクスプローラーから C:\errOut2.txt ファイルを開いて、内容を確認します。
    image
    今度は、エラー番号に加えて、エラー メッセージ(エラーの説明)も取得できていることを確認できます。このように、スクリプト コンポーネントを利用すると、エラーが発生した該当行を取得して、かつエラーの内容を確認できるようになるので、大変便利です。
  20. 最後に、[ファイル]メニューの[すべてを保存]をクリックして、SSISoyo2 プロジェクトを保存しておきます。このプロジェクトは、次の Step でも引き続き使用します。

0 件のコメント:

コメントを投稿