模拟脚本组件的错误输出
适用于:Azure 数据工厂中的 SQL Server SSIS Integration Runtime
虽然您无法在脚本组件中直接将输出配置为错误输出,以便自动处理错误行,但必要时可通过创建附加输出并在脚本中使用条件逻辑将行定向到此输出,以再现内置错误输出的功能。 您可能希望通过添加两个用于接收错误号以及出现错误的列的 ID 的附加输出列,以模拟内置错误输出的行为。
若要添加与特定预定义 Integration Services 错误代码对应的错误说明,可以使用 GetErrorDescription 接口的 IDTSComponentMetaData100 方法,该接口可通过脚本组件的 ComponentMetaData 属性提供。
示例
下面的示例使用一个配置为具有两个同步输出的转换的脚本组件。 该脚本组件的目的是从 AdventureWorks 示例数据库中的地址数据中筛选错误行。 此虚构示例假设我们正在为一项针对北美客户的促销活动做准备,需要筛选出不在北美的地址。
配置示例
创建新脚本组件之前,先创建一个连接管理器,并配置一个从 AdventureWorks 示例数据库选择地址数据的数据流源。 对于此示例,由于仅查看 CountryRegionName 列,所以只需使用 Person.vStateCountryProvinceRegion 视图,或通过联接 Person.Address、Person.StateProvince 和 Person.CountryRegion 表来选择数据。
向数据流设计器图面添加新的脚本组件并将其配置为转换。 打开“脚本转换编辑器” 。
在“脚本”页中,将 ScriptLanguage 属性设置为要用于编写脚本代码的脚本语言。
单击“编辑脚本”打开 Microsoft Visual Studio Tools for Applications (VSTA)。
在 Input0_ProcessInputRow 方法中,键入或粘贴如下所示的示例代码。
关闭 VSTA。
在“输入列”页中,选择要在脚本转换中处理的列。 此示例仅使用 CountryRegionName 列。 您未选择的可用列将不进行任何更改,原封不动地在数据流中传递。
在“输入和输出”页中,添加第二个新输出,并将其 SynchronousInputID 值设置为输入的 ID,这同时也是默认输出的 SynchronousInputID 属性的值。 将两个输出的 ExclusionGroup 属性都设置为同一非零值(例如 1),以指示每一行都将仅定向到两个输出中的一个。 以不同名称为新的错误输出命名,如“MyErrorOutput”。
向新错误输出中添加其他输出列,以捕获所需的错误信息,其中包括错误代码、出现错误的列的 ID,可能还有错误说明。 此示例将创建新列:ErrorColumn 和 ErrorMessage。 若要在自己的实现中捕获预定义的 Integration Services 错误,请确保为错误号添加了 ErrorCode 列。
记下脚本组件将查找其错误情况的一个或多个输入列的 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();
}
}