スクリプト コンポーネントによるエラー出力の強化
適用対象: SQL Server Azure Data Factory の SSIS 統合ランタイム
既定では、Integration Services のエラー出力の 2 つの追加列 (ErrorCode と ErrorColumn) には、エラー番号を表す数値コードと、エラーが発生した列の ID しか含まれていません。 これらの数値は、対応するエラーの説明と列の名前がないとあまり役に立ちません。
ここでは、スクリプト コンポーネントを使用して、データ フローの既存のエラー出力データにエラーの説明と列名を追加する方法を説明します。 この例では、IDTSComponentMetaData100 インターフェイスの GetErrorDescription メソッドを使用して、事前定義された特定の Integration Services エラー コードに対応するエラーの説明を追加します。これは、スクリプト コンポーネントの ComponentMetaData プロパティから使用できます。 次いで、この例では、同じインターフェイスの GetIdentificationStringByID メソッドを使用してキャプチャした系列 ID に対応する列名を追加します。
Note
複数のデータ フロー タスクおよび複数のパッケージでより簡単に再利用できるコンポーネントを作成する場合は、このスクリプト コンポーネント サンプルのコードを基にした、カスタム データ フロー コンポーネントの作成を検討してください。 詳細については、「 カスタム データ フロー コンポーネントの開発」を参照してください。
例
次に示す例では、変換として構成されたスクリプト コンポーネントを使用して、データ フローの既存のエラー出力データにエラー説明と列名を追加します。
スクリプト コンポーネントをデータ フローで変換として使用するための構成方法の詳細については、「スクリプト コンポーネントによる同期変換の作成」および「スクリプト コンポーネントによる非同期変換の作成」を参照してください。
このスクリプト コンポーネントの例を構成するには
新しいスクリプト コンポーネントを作成する前に、データ フローの上流コンポーネントを構成して、エラーや切り捨てが発生した場合に行をエラー出力にリダイレクトするようにします。 テスト目的の場合、たとえば、参照が失敗するような 2 つのテーブル間の参照変換を構成するなどして、エラーが発生するような形でコンポーネントを構成します。
新しいスクリプト コンポーネントを [データ フロー] デザイナー画面に追加し、変換として構成します。
上流コンポーネントからのエラー出力を新しいスクリプト コンポーネントに接続します。
[スクリプト変換エディター] を開き、[スクリプト] ページの [ScriptLanguage] プロパティでスクリプト言語を選択します。
[スクリプトの編集] をクリックして Microsoft Visual Studio Tools for Applications (VSTA) IDE を開き、以下に示すサンプル コードを追加します。
VSTA を閉じます。
スクリプト変換エディターの [入力列] ページで、[ErrorCode] 列と [ErrorColumn] 列を選択します。
[入力および出力] ページで、2 つの新しい列を追加します。
ErrorDescription という String 型の新しい出力列を追加します。 長いメッセージをサポートするために、新しい列の既定の長さを 255 に拡張します。
ColumnName という String 型の別の新しい出力列を追加します。 長い値をサポートするために、新しい列の既定の長さを 255 に拡張します。
[スクリプト変換エディター] を閉じます。
スクリプト コンポーネントの出力を、適切な変換先にアタッチします。 アドホック テスト用に最も構成しやすいのは、フラット ファイル変換先です。
パッケージを実行します。
Public Class ScriptMain ' VB
Inherits UserComponent
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
Row.ErrorDescription = _
Me.ComponentMetaData.GetErrorDescription(Row.ErrorCode)
Dim componentMetaData130 = TryCast(Me.ComponentMetaData, IDTSComponentMetaData130)
If componentMetaData130 IsNot Nothing Then
If Row.ErrorColumn = 0 Then
' 0 means no specific column is identified by ErrorColumn, this time.
Row.ColumnName = "Check the row for a violation of a foreign key constraint."
ELSE If Row.ErrorColumn = -1 Then
' -1 means you are using Table Lock for a Memory Optimised destination table which is not supported.
Row.ColumnName = "Table lock is not compatible with Memory Optimised tables."
Else
Row.ColumnName = componentMetaData130.GetIdentificationStringByID(Row.ErrorColumn)
End If
End If
End Sub
End Class
public class ScriptMain: // C#
UserComponent
{
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
Row.ErrorDescription = this.ComponentMetaData.GetErrorDescription(Row.ErrorCode);
var componentMetaData130 = this.ComponentMetaData as IDTSComponentMetaData130;
if (componentMetaData130 != null)
{
// 0 means no specific column is identified by ErrorColumn, this time.
if (Row.ErrorColumn == 0)
{
Row.ColumnName = "Check the row for a violation of a foreign key constraint.";
}
// -1 means you are using Table Lock for a Memory Optimised destination table which is not supported.
else if (Row.ErrorColumn == -1)
{
Row.ColumnName = "Table lock is not compatible with Memory Optimised tables.";
}
else
{
Row.ColumnName = componentMetaData130.GetIdentificationStringByID(Row.ErrorColumn);
}
}
}
}