在数据流任务的错误输出中捕获更多信息

时间:2012-06-18 19:30:21

标签: ssis dataflow

我创建了一个SSIS包

在数据流任务中我有几列

enter image description here

现在我将第0列和第3列的数据类型转换为 int ,故意创建错误: enter image description here

现在我将错误配置为:

enter image description here

之后我保留了数据查看器并执行了包,毫不奇怪我得到了预期的错误输出:

enter image description here

我可以看到我还有3个列

但我的问题是:

  1. 错误列将显示为101和73.如何获取正确的列名?
  2. 如何将其他信息添加到同一错误输出表: 包裹ID,包裹名称等

1 个答案:

答案 0 :(得分:1)

在SS2016及更高版本中这很容易: https://www.mssqltips.com/sqlservertip/4066/retrieve-the-column-causing-an-error-in-sql-server-integration-services/

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    Row.ErrorDescription = this.ComponentMetaData.GetErrorDescription(Row.ErrorCode);
    IDTSComponentMetaData130 componentMetaData = this.ComponentMetaData as IDTSComponentMetaData130;
    Row.ErrorColumnName = componentMetaData.GetIdentificationStringByID(Row.ErrorColumn);
}

对于使用SS2016之前版本的SQL Server的任何人,这里有一些参考链接,用于获取列名称:

http://www.andrewleesmith.co.uk/2017/02/24/finding-the-column-name-of-an-ssis-error-output-error-column-id/

基于: http://toddmcdermid.blogspot.com/2016/04/finding-column-name-for-errorcolumn.html

我很欣赏我们不应该发布链接,但是这种解决方案非常复杂,我试图通过从Todd和Andrew的博客文章中提取信息并在此处重新创建来进行总结。 (如果您都读过这篇文章,谢谢你们!)

在Todd的页面上:

  
      
  1. 转到“输入和输出”页面,然后选择“输出0”节点。   将“ SynchronousInputID”属性更改为“无”。 (此更改   脚本从同步到异步。)      
        
    1. 在同一页面上,打开“输出0”节点,然后选择“输出”   列”文件夹。按“添加列”按钮。更改“名称”   该新列的“ LineageID”属性。
    2.   
    3. 再次按“添加列”按钮,然后更改“数据类型”   属性设置为“ Unicode字符串[DT_WSTR]”,然后更改“名称”   属性为“ ColumnName”。
    4.   
    5. 转到“脚本”页面,然后按“编辑脚本”按钮。复制   并将此代码粘贴到ScriptMain类中(您可以删除所有   其他方法存根):
    6.   
  2.   
public override void CreateNewOutputRows() {
    IDTSInput100 input = this.ComponentMetaData.InputCollection[0];
    if (input != null)
    {
        IDTSVirtualInput100 vInput = input.GetVirtualInput();
        if (vInput != null)
        {
            foreach (IDTSVirtualInputColumn100 vInputColumn in vInput.VirtualInputColumnCollection)
            {
                Output0Buffer.AddRow();
                Output0Buffer.LineageID = vInputColumn.LineageID;
                Output0Buffer.ColumnName = vInputColumn.Name;
            }
        }
    } }
  

可以使用数据查看器随意将虚拟输出附加到该脚本,   看看你得到什么。从这里开始,这就是您的“标准工程”   ETL专家。只需合并合并失败的错误输出   带有此元数据的组件,您将能够转换   将ErrorColumn号转换为有意义的列名。

     

但是对于那些想了解以上脚本内容的人   在做:

     
      
  1. 正在将“第一个(也是唯一)”输入附加到脚本   零件。      
        
    1. 正在获取与输入有关的虚拟输入。 “输入”是   该脚本实际上可以在输入中“看到”什么-并且由于我们   没有将任何列标记为“ ReadOnly”或“ ReadWrite” ...   表示输入没有NO列。但是,“虚拟输入”具有   无论是否存在,每个存在的列的完整列表   说我们正在“使用”它。
    2.   
    3. 然后,我们遍历此虚拟机上的所有“虚拟列”   输入,然后每一个...
    4.   
    5. 获取LineageID和列名,并将其作为新行推出   我们的异步脚本。
    6.   
  2.   

安德鲁(Andrew)页面上的图片和文字有助于对其进行更详细的说明:

enter image description here

  

然后将此地图与ErrorColumn世系ID合并合并。   沿着错误路径前进,以便可以将错误信息   附加了地图中的列名。我包括了一秒钟   从错误中查找错误描述的脚本组件   代码,因此我们在上面看到的错误表行同时包含两列   名称和错误说明。

     

需要说明的其余部分是条件拆分   –存在的目的只是向脚本组件提供元数据   创建地图。我创建了一个表达式(1 == 0)   对于“无行–仅元数据”路径,结果为false,因此没有行   往下走。

     

尽管此解决方案确实需要插入一些其他内容   深入数据流中,我们获得了非常有价值的信息   确实发生错误时记录。所以特别是当数据流是   在生产中无人值守时运行–当我们没有工具和   设计时可用的技术来找出问题所在–   记录的结果为我们提供了有关以下信息的更精确信息   出了什么问题以及为什么,与仅向我们提供失败的数据相比   并让我们弄清楚为什么它被拒绝了。