使用脚本组件增强错误输出
适用于:Azure 数据工厂中的 SQL Server SSIS Integration Runtime
默认情况下,Integration Services 错误输出中的另外两列 ErrorCode 和 ErrorColumn 只包含表示错误号的数值代码以及出现错误的列的 ID。 如果没有相应的错误说明和列名称,这些数值可能没有多大用处。
本主题介绍如何使用脚本组件向数据流中的现有错误输出数据添加错误说明和列名称。 示例使用 IDTSComponentMetaData100 接口的 GetErrorDescription 方法添加与特定预定义 Integration Services 错误代码对应的错误说明,该接口通过脚本组件的 ComponentMetaData 属性提供。 然后,示例通过使用同一接口的 GetIdentificationStringByID 方法,添加与捕获的沿袭 ID 对应的列名称。
注意
如果希望创建可更方便地重用于多个数据流任务和多个包的组件,请考虑以此脚本组件示例中的代码为基础,创建自定义数据流组件。 有关详细信息,请参阅 开发自定义数据流组件。
示例
下面显示的示例使用一个配置为转换的脚本组件向数据流中的现有错误输出数据添加错误说明和列名称。
有关如何将脚本组件配置为用作数据流中的转换的详细信息,请参阅使用脚本组件创建同步转换和使用脚本组件创建异步转换。
配置此脚本组件示例
创建新脚本组件之前,先配置数据流中的上游组件,以便在错误或截断出现时将行重定向到上游组件的错误输出。 出于测试目的,可能希望以确保将发生错误的方式来配置组件,例如,在两个将发生查找失败的表之间配置一个查找转换。
向数据流设计器图面添加新的脚本组件并将其配置为转换。
将错误输出从上游组件连接到新脚本组件。
打开“脚本转换编辑器”,在“脚本”页中,为 ScriptLanguage 属性选择脚本语言。
单击“编辑脚本”打开 Microsoft Visual Studio Tools for Applications (VSTA) IDE,并添加下面的示例代码。
关闭 VSTA。
在脚本转换编辑器的“输入列”页中,选择 ErrorCode 列和 ErrorColumn 列。
在“输入和输出”页中,添加两个新列。
添加一个名为 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);
}
}
}
}