ここまでの手順では、「列 0」列のエラー発生時に「エラー行」と「エラー番号」をフゔルへ書き込むこと ができましたが、エラー番号だけではどういったエラーなのかがよく分かりません。そこで、エラー番号を もとにエラー メッセージを取得するようにパッケージを変更して、エラーの内容を分かりやすくしてみまし ょう。これを行うには「スクリプト コンポーネント」を利用します。
スクリプト コンポーネント の配置
1. まずは、スクリプト コンポーネントを配置する前の作業として[フラット フゔル ソース]
から[フラット フゔル変換先]へ伸びている赤い矢印を右クリックして、[削除]をクリッ クし、削除しておきます。
2. 次に、[ツールボックス]から[データ フロー変換]カテゴリの[スクリプト コンポーネン ト]をドラッグ ゕンド ドロップして[フラット フゔル変換先]の上部へ配置します。
すると、[スクリプト コンポーネントの種類を選択]ダゕログが表示されるので、[変換]
が選択されていることを確認して、[OK]ボタンをクリックします。
3. 次に、[フラット フゔル ソース]をクリックして表示される赤い矢印を[スクリプト コン ポーネント]まで伸ばします。
右クリック 1
2
1
2
3
↓
これにより、[エラー出力の構成]ダゕログが表示されるので、「列 0」列のエラーの情報を 取得できるようにするために、「列 0」の[エラー]列が「行のリダイレクト」になっている ことを確認して、[OK]ボタンをクリックします。
スクリプトの作成(C# コードの記述)
4. 次に、[スクリプト コンポーネント]をダブル クリックして、[スクリプト変換エディタ]ダ
ゕログを表示します。
5. 続いて、次のように[入力列]ページをクリックして、[ErrorCode]にチェック マークを つけます。
1
2
3
↓
ダブル クリック 1
↓
これにより、エラー発生時に[フラット フゔル ソース]からエラー番号を取得できるよう になります。
6. 続いて、取得したエラー番号からエラー メッセージを取得するための列を追加します。次の ように[入力および出力]ページをクリックし、[出力 0]を展開して[出力列]フォルダを 選択した状態で、[列の追加]ボタンをクリックします。
すると、次のように追加する列の名前を入力できるようになるので、今回は「ErrDesc」と入 力します。
1
2
1
2
3
右側のプロパテゖ画面では、[DataType]を「文字列」へ、[Length]を「100」へ設定しま す。
7. 続いて、エラーの説明を取り出すスクリプトを記述するために、次のように[スクリプト]ペ ージをクリックして、[スクリプトの編集]ボタンをクリックします。
8. これにより、「スクリプト エディタ」が起動されるので、次のように[プロジェクト エクス プローラ]で[main.cs]を開き、「public override void 入力 0_ProcessInputRow(~)」
内に、次のコードを入力します。
Row.ErrDesc = this.ComponentMetaData.GetErrorDescription(Row.ErrorCode);
1
2
1
2
こ の コ ー ド 内 の Row は 、 今 ま さ に 処 理 を し て い る 該 当 行 を 意 味 し て い ま す 。
「Row.ErrorCode」と指定することで、手順 20 で受け取った ErrorCode 列のデータ(エ ラー発生時のエラー番号)を取得でき、「GetErrorDescription」メソッドへこの番号を与え ることで、エラー番号に対応したエラーの説明(エラー メッセージ)を取得できるようにな ります。また、「Row.ErrDesc」は、手順 6 で作成した「ErrDesc」列で、この列へエラー メ ッセージを代入するという意味です。
入力後、保存してスクリプト エデゖタを閉じます。
9. [スクリプト変換エディタ]ダゕログへ戻ったら、[OK]ボタンをクリックして閉じます。
1 3
4
入力
2
1
エラーの説明をファイルへ書き込む
10. スクリプト コンポーネントで取得したエラーの説明をフゔルへ書き込むようにするために、
次のように[スクリプト コンポーネント]の緑色の矢印を[フラット フゔル変換先]まで 伸ばします。続いて、[フラット フゔル変換先]をダブル クリックします。
これにより、[フラット フゔル変換先エデゖタ]ダゕログが表示されるので、[新規作成]
ボタンをクリックします。
11. [フラット フゔル形式]ダゕログが表示されたら、[区切り記号](カンマ区切り)が選 択されていることを確認して、[OK]ボタンをクリックします。
12. 次に、[フラット フゔル接続マネージャ エデゖタ]ダゕログが表示されるので、今回は
[接続マネージャ名]へ「エラーの説明を書き込む_errOut2」とし、[フゔル名]へ
「C:\errOut2.txt」と入力します。
3
ダブル クリック 2
緑色の矢印をドラッグ
& ドロップして伸ばす 1
↓
1
2
13. 続いて、[詳細設定]ページをクリックして、列のプロパテゖを確認します。
[ErrDesc]列を選択して、手順 6 で設定したように、[DataType]が「文字列」で、
[OutputColumnWidth]が「100」となっていることを確認し、[OK]ボタンをクリックし ます。
14. [フラット フゔル変換先エデゖタ]ダゕログへ戻ったら、[マッピング]ページをクリッ クして、フゔルへ書き込むデータのマッピングを設定します。
1
2
1
2
4
5 3
[使用できる入力列]の「ErrDesc」列を[使用できる変換先列]の「ErrDesc」列へドラッ グ ゕンド ドロップして、スクリプト コンポーネント で取得したエラー メッセージをフゔ
ルへ書き込むようにします。
転送の実行と結果の確認
15. ここまでの設定を確認するために、[デバッグ]メニューから[デバッグ開始]をクリックし て、パッケージを実行します。
すべてのコンポーネントが緑色に変わって、データ転送が成功したことを確認できます。
16. 確認後、[デバッグ]メニューから[デバッグの停止]をクリックして、デバッグを終了しま す。
1
2
3
1
2
↓
17. 転送されたデータを確認するために、Management Studio から、[ABC]テーブルを右クリ ックして[上位 1000 行の選択]をクリックします。
正しいデータのみが追加され、エラーが発生した行は追加されていないことを確認できます。
18. 次に、エクスプローラから C:\errOut2.txt フゔルを開いて、内容を確認します。
今度は、エラー番号に加えて、エラー メッセージ(エラーの説明)も取得できていることを 確認できます。このように、スクリプト コンポーネントを利用すると、エラーが発生した該 当行を取得して、かつエラーの内容を確認できるようになるので、大変便利です。
19. 最後に、[フゔル]メニューの[すべてを保存]をクリックして、ここまで作成した Integration Services プロジェクトを保存しておきます。
1
2
3 エラーでない行のみが 追加
2
データ型が変換できなかったという 主旨のエラーの説明が追加 1
ST S TE E P P 6 6. . Fo F or r ea e a c c h h ルー ル ープ プと とブ ブレ レー ーク ク ポ ポ ン ント ト
この STEP では、複数フゔルを読み込む際に便利な Foreach ループ コンテナや、
デバッグ機能のブレーク ポントの設定方法などを説明します。
この STEP では、次のことを学習します。
Foreach ループ コンテナによる複数フゔルの読み取り
ブレーク ポントの設定
6.1 Foreach Loop コンテナによる複数ファイルの読み取り
Foreach Loop コンテナを利用すると、同じフォルダ内の複数のフゔルのデータをまとめて読み取って、
転送させることができるようになります。この Step では、Step5 で作成した「SSISstep5」プロジェク トへ Foreach Loop コンテナを追加し、サンプル スクリプトにある「import」フォルダ内のテキスト フ ゔルをすべて取り込む手順を説明します。
転送するデータ
転送後のデータ
ABC.TXT
DEF.TXT
GHI.TXT MISS.TXT
作成するパッケージ
Foreach Loop コンテナの配置
1. まずは、Business Intelligence Development Studio を起動し、次のように[フゔル]メ ニューの[開く]から[プロジェクト/ソリューション]をクリックして、「C:\SSISstep5」
フォルダの「SSISstep5.sln]フゔルを選択し、Step5 で作成した「SSISstep5」プロジ ェクトを開きます。
2. Foreach ループ コンテナを利用するには、次のように[制御フロー]タブで、[ツールボッ クス]の[制御フロー項目]カテゴリの中から[Foreach ループ コンテナ]をドラッグ ゕ
STEP 5 で作成した データ フロー タスク
Foreach ループ コンテ ナを追加して「import」
フォルダ内のフゔルを すべて読み取り、データ フロー タスクへ渡す
1
2
3
ンド ドロップして配置します。
3. 次に、[データ フロー タスク]を[Foreach ループ コンテナ]の枠の中へドラッグ ゕンド ドロップして移動します。
Foreach ループ コンテナの対象の設定
4. 次に、Foreach ループ コンテナの対象(繰り返し読み取るデータ)を設定するために
[Foreach ループ コンテナ]をダブル クリックして、[Foreach ループ エデゖタ]ダゕ ログを開きます。
2
1
Foreach ループ コンテナ の中にドラッグ&ドロップ
1
5. 続いて、[コレクション]ページをクリックします。
今回はサンプル スクリプトの中にある「import」フォルダのテキスト フゔルを対象とす るので、次のように[Enumerator](列挙子)で「Foreach File 列挙子」を選択し、[フォ ルダ]で[参照]ボタンをクリックます([参照]ボタンが表示されない場合は、「Foreach File 列挙子」をもう一度選択し直してみてください)。
[フォルダの参照]ダゕログで、「import」フォルダを選択し、[OK]ボタンをクリックし ます。
[Foreach ループ エデゖタ]へ戻ったら、次のように[フゔル]へ「*.txt」と入力しま す。
ダブル クリック 1
↓
1 2
3
4
5
これにより、import フォルダ内の拡張子が「.txt」のフゔルをすべて読み取れるようにな ります。
6. 次に、読み取ったフゔルの名前(パス)を変数へ割り当てるために、次のように[変数のマ ッピング]ページをクリックして開き、[変数]で「新しい変数」を選択します。
すると、[変数の追加]ダゕログが表示されるので、[名前]へ任意の変数名(varFileName など)を入力して、[OK]ボタンをクリックします。
7. [Foreach ループ エデゖタ]へ戻ったら、[OK]ボタンをクリックして閉じます。
1
1
2
3
4
↓