首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SSIS中从Lineageid查找列名的简单方法是什么

在SSIS中从Lineageid查找列名的简单方法是什么
EN

Stack Overflow用户
提问于 2011-11-14 19:03:18
回答 5查看 15.1K关注 0票数 5

在SSIS中从Lineageid中查找列名的简单方法是什么?有没有可用的系统变量?

EN

回答 5

Stack Overflow用户

发布于 2011-11-14 23:40:44

我记得我说过这不会很难,我可以在错误重定向中编写一些脚本来从输入集合中查找列名。

string badColumn = this.ComponentMetaData.InputCollection[Row.ErrorColumn].Name;

我所了解到的是失败的列不在这个集合中。是的,但是报告的ErrorColumn并不完全是我需要的。我找不到那个包,但是这里有一个我为什么不能得到我需要的东西的例子。希望你会有更好的运气。

这是一个简单的数据流,一旦命中派生列,就会因为除以零而产生错误。派生列生成一个新的输出列(LookAtMe)作为除法的结果。错误输出上的数据查看器告诉我失败的列是73。使用上面的脚本逻辑,如果我试图访问输入集合中的列73,它将失败,因为它不在集合中。LineageID 73是LookAtMe,而LookAtMe不在我的错误分支中,它只在非错误分支中。

这是我的XML的副本,你可以看到,是的,outputColumn id73是LookAtme。

代码语言:javascript
运行
复制
<outputColumn id="73" name="LookAtMe" description="" lineageId="73" precision="0" scale="0" length="0" dataType="i4" codePage="0" sortKeyPosition="0" comparisonFlags="0" specialFlags="0" errorOrTruncationOperation="Computation" errorRowDisposition="RedirectRow" truncationRowDisposition="RedirectRow" externalMetadataColumnId="0" mappedColumnId="0"><properties>

不过,我真的很想要这些数据,而且我很聪明,所以我可以将所有结果重新组合在一起,然后有条件地将其拆分出来,以获得这些数据。问题是,Union All is an asynchronous transformation。异步转换会导致将数据从一组butters复制到另一组,从而产生in...new谱系id,因此即使使用所有将两个流重新组合在一起的联合,您也无法调用数据流链来找到原始谱系id,因为它位于不同的缓冲区中。

在这一点上,我承认失败了,并决定我可以在我的包中没有智能/有用的错误报告。

票数 4
EN

Stack Overflow用户

发布于 2014-11-19 04:51:18

我知道这是一个很长的死线,但我偶然发现了这个问题的手动解决方案,并认为我会分享给任何遇到同样问题的人。诚然,这不能提供问题的程序化解决方案,但对于简单的调试,它应该可以做到这一点。该解决方案使用派生列作为示例,但这似乎适用于任何数据流组件。

来自 的答案,由Todd McDermid提供

"...不幸的是,列的沿袭ID很好地隐藏在SSIS中。它是SSIS用来标识列的“键”。因此,为了确定是哪一列,您需要打开派生列组件或数据转换的高级编辑器。右键单击并选择“高级编辑器”即可完成此操作。转到“输入和输出属性”选项卡。打开第一个节点-“派生列输入”或“数据转换输入”。打开“输入列”选项卡。单击各个列,注意每个列的"LineageID“属性。您可能需要对“派生列输出”节点和其中的“输出列”执行相同的操作。与您记录的谱系ID匹配的列是违规列。“

票数 1
EN

Stack Overflow用户

发布于 2018-10-10 16:54:28

对于使用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. 进入“Input
  2. Output”页面,选择"Output 0“节点。将"SynchronousInputID“属性更改为"None”。(这会将脚本从同步更改为异步。)
    1. 在同一个页面上,打开"Output 0“节点并选择"Output Columns”文件夹。按"Add Column“按钮。将此新列的"Name“属性更改为再次编辑"Add Column”按钮,将"DataType“属性更改为"Unicode string DT_WSTR",并将"Name”属性更改为"Script“页面,然后按下”"LineageID".
    2. Press Script“按钮。将此代码复制并粘贴到ScriptMain类中(您可以删除所有其他方法stubs):

代码语言:javascript
运行
复制
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“……这意味着输入没有列。然而,“虚拟输入”拥有存在的每一列的完整列表,无论我们是否说过我们正在“使用”它。
    2. 然后循环遍历此虚拟输入上的所有“虚拟列”,并且对于每个列,
    3. 获取LineageID和列名,并将它们作为异步all上的新行推出

来自Andrew页面的图片和文本有助于更详细地解释它:

然后,将此映射与沿着错误路径下行的ErrorColumn谱系ID进行合并连接,以便可以将错误信息附加到映射中的列名。我包含了第二个脚本组件,它从错误代码中查找错误描述,因此我们在上面看到的错误表行同时包含列名和错误描述。

需要解释的其余组件是条件拆分-它的存在只是为了向创建地图的脚本组件提供元数据。我创建了一个表达式(1 == 0),对于“no Rows - Metadata Only”路径,该表达式的计算结果始终为false,因此不会有任何行沿着该路径传播。

虽然这个解决方案确实需要在数据流中插入一些额外的管道,但当确实发生错误时,我们会获得非常有价值的信息。因此,特别是当数据流在生产中无人值守运行时-当我们在设计时没有可用的工具和技术来找出问题所在时-与简单地给出失败的数据并让我们找出为什么被拒绝相比,日志记录为我们提供了关于哪里出了问题以及为什么出了问题的更准确的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8120634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档