スクリプト コンポーネントに対するエラー出力のシミュレート
エラー行の自動処理のスクリプト コンポーネントでエラー出力として出力を直接構成することはできませんが、別の出力を作成するか、可能な場合はスクリプトで条件ロジックを使用してこの出力に行を送信することによって、組み込みエラー出力の機能を再現することができます。2 つの出力列を追加してエラー番号、およびエラーが発生した列の ID を受け取ることにより、組み込みエラー出力の動作を模倣することもできます。
事前定義された特定の Integration Services エラー コードに対応するエラーの説明を追加する場合は、IDTSComponentMetaData100 インターフェイスの GetErrorDescription メソッドを使用できます。これは、スクリプト コンポーネントの ComponentMetaData プロパティから使用できます。
例
次に示す例では、2 つの同期出力を持つ変換として構成された、スクリプト コンポーネントを使用します。このスクリプト コンポーネントの目的は、AdventureWorks2008R2 サンプル データベースの住所データから、エラー行をフィルター選択することです。この架空の例では、北米の顧客向けプロモーションを準備中であり、北米以外の住所をフィルターによって除外する必要があるものとします。
例を構成するには
新しいスクリプト コンポーネントの作成前に、接続マネージャーを作成し、AdventureWorks2008R2 サンプル データベースから住所データを選択するデータ フローの変換元を構成します。この例では CountryRegionName 列のみを調べるので、単純に Person.vStateCountryProvinceRegion ビューを使用できます。また、Person.Address、Person.StateProvince、および Person.CountryRegion の表を結合して、データを選択することもできます。
新しいスクリプト コンポーネントを [データ フロー] デザイナー画面に追加し、変換として構成します。[スクリプト変換エディター] を開きます。
[スクリプト] ページの [ScriptLanguage] プロパティに、スクリプトのコード作成に使用するスクリプト言語を設定します。
[スクリプトの編集] をクリックして、Microsoft Visual Studio Tools for Applications (VSTA) を開きます。
Input0_ProcessInputRow メソッドに、以下に示すサンプル コードを入力するか貼り付けます。
VSTA を閉じます。
[入力列] ページで、スクリプト変換で処理する列を選択します。この例では CountryRegionName 列のみを使用します。選択しなかった使用可能な入力列は、データ フロー内で変更されず、そのまま渡されます。
[入力および出力] ページで、2 つ目の新しい出力を追加し、その SynchronousInputID 値を入力の ID に設定します。これは、既定の出力の SynchronousInputID プロパティの値でもあります。両方の出力の ExclusionGroup プロパティを 0 以外の同じ値 (たとえば 1) に設定し、各行が 2 つの出力のうち一方のみに送られるようにします。新しいエラー出力に、"MyErrorOutput" などのわかりやすい名前を付けます。
必要なエラー情報を取得するため、追加の出力列を新しいエラー出力に追加します。エラー コード、エラーが発生した列の ID、エラーの説明などを含めることができます。この例では、新しい列 ErrorColumn および ErrorMessage を作成しています。事前定義された Integration Services エラーを独自の実装で検出する場合、エラー番号用の ErrorCode 列を必ず追加してください。
スクリプト コンポーネントがエラー状態を確認する入力列 (複数の場合もある) の ID 値を書き留めます。この例では、この列 ID を使用して ErrorColumn 値を設定します。
[スクリプト変換エディター] を閉じます。
スクリプト コンポーネントの出力を、適切な変換先にアタッチします。アドホック テスト用に最も構成しやすいのは、フラット ファイル変換先です。
パッケージを実行します。
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
If Row.CountryRegionName <> "Canada" _
And Row.CountryRegionName <> "United States" Then
Row.ErrorColumn = 68 ' ID of CountryRegionName column
Row.ErrorMessage = "Address is not in North America."
Row.DirectRowToMyErrorOutput()
Else
Row.DirectRowToOutput0()
End If
End Sub
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
if (Row.CountryRegionName!="Canada"&&Row.CountryRegionName!="United States")
{
Row.ErrorColumn = 68; // ID of CountryRegionName column
Row.ErrorMessage = "Address is not in North America.";
Row.DirectRowToMyErrorOutput();
}
else
{
Row.DirectRowToOutput0();
}
}
|