作成するパッケージの概要
作成するパッケージの概要
この STEPでは、データ転送時に起こりがちな、転送元のデータにイレギュラーな値が入っていた場合に発生するエラーの対処方法について説明します。前の Step で作成したエラーの発生するパッケージ(SSISoyo2 プロジェクト)を利用して、エラーの対処方法を試していきます。
SSISoyo2 プロジェクトの内容
この Step の実習を行うには、事前に Step3 と Step4 を行い、SSISoyo2 プロジェクトを作成しておく必要があります。SSISoyo2 プロジェクトのパッケージは、次のようなテキスト ファイル(タブ区切り)のデータを SQL Server へ転送し、データ型のエラー(文字と数値が混在している場合のエラー)を発生させるものです。
転送するファイル
作成するパッケージ
この Step では、SSISoyo2 プロジェクトを、次のように変更していきます。
SSISoyo2 プロジェクトの動作確認
SSISoyo2 プロジェクトの動作確認(エラーが発生することの確認)
まずは、前の Step で作成した SSISoyo2 プロジェクトのパッケージを実行して、動作確認をします。
- パッケージの実行結果を確認しやすくするために、転送先の ssisdb3 データベース内にある ABC テーブルを一度空にしておきます。
- 次に、パッケージの[データ フロー]タブを開いてから、デバッグを実行します。
配置している[フラット ファイル ソース]が実行中に変わって、前の Step で作成した OnError イベント ハンドラーが実行されて、エラー番号とエラーの説明がメッセージ ボックスで表示されることを確認できます。
このメッセージ ボックスは、エラー(OnError イベント)が発生した数の分だけ表示されるので、その分[OK]ボタンをクリックします。 - すべてのメッセージ ボックスが表示され、[フラット ファイル ソース]がエラーになって、転送が失敗したことを確認できます。
確認後、デバッグを終了します。 - 次に、Management Studio から、[ABC]テーブルを右クリックして、[上位 1000 行の選択]をクリックし、データを確認します。
データ転送が失敗しているので、MISS.txt ファイルのデータは追加されていないことを確認できます。
エラーを無視する
エラーを無視する
SSIS パッケージには、データ転送時にエラーが発生した場合でも、エラーを無視してデータ転送を続行させる機能があります。それでは、これを試してみましょう。
- エラーを無視させるには、次のように配置した[フラット ファイル ソース]をダブル クリックして[フラット ファイル ソース エディター]ダイアログを表示します。
- このダイアログでは、次のように[エラー出力]ページをクリックして、[列0]の[エラー]ドロップダウン リストを「エラーを無視する」へ変更し、[OK]ボタンをクリックします。
- エラーが無視されることを確認するために、パッケージをデバッグ実行します。
エラーが無視されることを確認するために、パッケージをデバッグ実行します。
今度は、すべてのコンポーネントに緑のチェックマークが付いて、データ転送が成功していることを確認できます。 - 確認後、デバッグを終了します。
- 転送されたデータを確認するために、Management Studio から、「ABC」テーブルを右クリックして、[上位 1000 行の選択]をクリックします。
MISS.txt のデータが追加されていることを確認できますが、「列0」列の文字データは「NULL」として追加され、正しいデータ(7, ZZZZ)はきちんと転送されていることを確認できます。
エラー情報をファイルへ書き込む
エラー情報をファイルへ書き込む
次に、「列0」でエラーが発生したときのエラー情報(エラーが発生した行データとエラー情報)をファイルへ書き込むようにパッケージを変更してみましょう。
- エラー情報をファイルへ書き込むようにするには、次のように SSIS ツールボックスから[その他の変換先]カテゴリにある[フラット ファイル変換先]をドラッグ&ドロップして配置します。
- 次に、[フラット ファイル ソース]でエラーが発生した場合に、[フラット ファイル変換先]へ転送されるように、次のように[フラット ファイル ソース]をクリックして表示される "赤い矢印" を[フラット ファイル変換先]まで伸ばします。
これにより、[エラー出力の構成]ダイアログが表示されるので、[列0]の[エラー]列を「エラーを無視する」から「行のリダイレクト」へ変更します。これで、「列0」列でエラーが発生した場合に、エラー情報を別のコンポーネントへリダイレクト(転送)できるようになります。 - 次に、[フラット ファイル変換先]をダブル クリックして、リダイレクトされたエラー情報を書き込むファイルを設定します。
[フラット ファイル変換先エディター]ダイアログが表示されたら、[新規作成]ボタンをクリックします。 - これにより、次のように[フラット ファイル形式]ダイアログが表示されて、書き込むファイルの書式を問われるので、「区切り記号」(カンマ区切り)が選択されていることを確認して、[OK]ボタンをクリックします。
- 次に、[フラット ファイル接続マネージャー エディター]ダイアログが表示されるので、今回は、次のように[接続マネージャー名]へ「エラー情報の書き込み_errOut」、[ファイル名]へ「C:\errOut.txt」と入力して、[OK]ボタンをクリックします。
- [フラット ファイル変換先エディター]ダイアログへ戻ったら、[マッピング]ページをクリックして、ファイルへ書き込むデータのマッピングを設定します。
受け取るデータ(使用できる入力列)には、[フラット ファイル ソースのエラー出力列](エラーが発生した該当行)と、[ErrorCode](エラー番号)、[ErrorColumn](エラー列)があり、エラーに関する情報が転送されてくることを確認できます。この転送されたデータをそのままファイルへ書き込むように、各列が線で結ばれている(マッピングされている)ことを確認して、[OK]ボタンをクリックします。 - ここまでの設定を確認するために、パッケージをデバッグ実行します。
すべてのコンポーネントに緑のチェックマークが付いて、データ転送が成功していることを確認できます。また、青色の矢印(成功時の処理)には「1 行」、赤色の矢印(エラー時の処理)には「2 行」と表示されて、成功が 1 行、エラーが 2 行であったことを確認することができます。 - 確認後、デバッグを終了します。
- 転送されたデータを確認するには、Management Studio から、「ABC」テーブルを右クリックして、[上位 1000 行の選択]をクリックします。
今度は、正しいデータのみが追加され、エラーが発生した行は追加されていないことを確認できます。 - 次に、Windows エクスプローラーから C:\errOut.txt ファイルを開き、エラー情報を取得できたかどうかを確認します。
エラーが発生した該当行がそのまま格納され、カンマで区切られてエラー番号を取得できていることを確認できます。
スクリプト コンポーネント(C#)によるエラー メッセージの取得
スクリプト コンポーネントによるエラー メッセージの取得
ここまでの手順では、「列0」列のエラー発生時に「エラー行」と「エラー番号」をファイルへ書き込むことができましたが、エラー番号だけではどういったエラーなのかがよく分かりません。そこで、エラー番号をもとにエラー メッセージを取得するようにパッケージを変更して、エラーの内容を分かりやすくしてみましょう。これを行うには、スクリプト コンポーネントを利用します。
それでは、これを試してみましょう。
- まずは、スクリプト コンポーネントを配置する前の作業として[フラット ファイル ソース]から[フラット ファイル変換先]へ伸びている「赤い矢印」を右クリックして、[削除]をクリックし、削除しておきます。
- 次に、SSIS ツールボックスから[共通]カテゴリの[スクリプト コンポーネント]をドラッグ&ドロップして[フラット ファイル変換先]の上部へ配置します。
これにより、[スクリプト コンポーネントの種類を選択]ダイアログが表示されるので、[変換]が選択されていることを確認して、[OK]ボタンをクリックします。 - 次に、[フラット ファイル ソース]をクリックして表示される赤い矢印を[スクリプト コンポーネント]まで伸ばします。
これにより、[エラー出力の構成]ダイアログが表示されるので、「列0」列のエラーの情報を取得できるようにするために、「列0」の[エラー]列が「行のリダイレクト」になっていることを確認して、[OK]ボタンをクリックします。 - 次に、[スクリプト コンポーネント]をダブル クリックします。
- [スクリプト変換エディター]ダイアログが表示されたら、[入力列]ページをクリックして開き、[ErrorCode]にチェック マークをつけます。
これにより、エラー発生時に[フラット ファイル ソース]からエラー番号を取得できるようになります。 - 続いて、取得したエラー番号からエラー メッセージを取得するための列を追加します。[入力および出力]ページをクリックし、[出力0]を展開して[出力列]フォルダーを選択した状態で、[列の追加]ボタンをクリックします。
- すると、次のように追加する列の名前を入力できるようになるので、今回は「ErrDesc」と入力します。
右側のプロパティ画面では、[DataType]を「文字列 [DT_STR]」、[Length]を「100」へ変更します。 - 続いて、エラーの説明を取り出すスクリプトを記述するために、次のように[スクリプト]ページをクリックして、[スクリプトの編集]ボタンをクリックします。
- これにより、「スクリプト エディター」が起動されるので、「public override void 入力0_ProcessInputRow(~)」内に、次のコード(C#)を入力します。
Row.ErrDesc = this.ComponentMetaData.GetErrorDescription(Row.ErrorCode);
このコード内の Row は、今まさに処理をしている該当行を意味しています。「Row.ErrorCode」と指定することで、前の手順で受け取った ErrorCode 列のデータ(エラー発生時のエラー番号)を取得でき、「GetErrorDescription」メソッドへこの番号を与えることで、エラー番号に対応したエラーの説明(エラー メッセージ)を取得できるようになります。また、「Row.ErrDesc」は、前の手順で作成した「ErrDesc」列で、この列へエラー メッセージを代入するという意味です。なお、Visual Basic でコードを記述する場合は、「this」を「Me」へ変更して、最後のセミコロン(;)を削除します。
入力後、保存してスクリプト エディターを閉じます。 - [スクリプト変換エディター]ダイアログへ戻ったら、[OK]ボタンをクリックして閉じます。
- スクリプト コンポーネントで取得したエラーの説明をファイルへ書き込むようにするために、次のように[スクリプト コンポーネント]の青色の矢印を[フラット ファイル変換先]まで伸ばします。続いて、[フラット ファイル変換先]をダブル クリックします。
これにより、[フラット ファイル変換先エディター]ダイアログが表示されるので、[新規作
成]ボタンをクリックします。
- [フラット ファイル形式]ダイアログが表示されたら、[区切り記号](カンマ区切り)が選択されていることを確認して、[OK]ボタンをクリックします。
- 次に、[フラット ファイル接続マネージャー エディター]ダイアログが表示されるので、今回は[接続マネージャー名]へ「エラーの説明を書き込む_errOut2」とし、[ファイル名]へ「C:\errOut2.txt」と入力します。
- 続いて、[詳細設定]ページをクリックして、列のプロパティを確認します。
[ErrDesc]列を選択して、前の手順で設定したように、[DataType]が「文字列」で、[OutputColumnWidth]が「100」となっていることを確認し、[OK]ボタンをクリックします。 - [フラット ファイル変換先エディター]ダイアログへ戻ったら、[マッピング]ページをクリックして、ファイルへ書き込むデータのマッピングを設定します。
[使用できる入力列]の「ErrDesc」列を、[使用できる変換先列]の「ErrDesc」列へドラッグ&ドロップして、スクリプト コンポーネントで取得したエラー メッセージをファイルへ書き込むようにします。 - パッケージをデバッグ実行して、ここまでの設定を確認します。
すべてのコンポーネントに緑のチェックマークが付いて、データ転送が成功したことを確認できます。 - 確認後、デバッグを終了します。
- 転送されたデータを確認するために、Management Studio から、[ABC]テーブルを右クリックして、[上位 1000 行の選択]をクリックします。
- 次に、エクスプローラーから C:\errOut2.txt ファイルを開いて、内容を確認します。
今度は、エラー番号に加えて、エラー メッセージ(エラーの説明)も取得できていることを確認できます。このように、スクリプト コンポーネントを利用すると、エラーが発生した該当行を取得して、かつエラーの内容を確認できるようになるので、大変便利です。 - 最後に、[ファイル]メニューの[すべてを保存]をクリックして、SSISoyo2 プロジェクトを保存しておきます。このプロジェクトは、次の Step でも引き続き使用します。
0 件のコメント:
コメントを投稿