我正在复制我的答案,以便我们可以在网站上获得权威的问答
在SSIS中从Lineageid查找列名的简单方法是什么 https://stackoverflow.com/questions/8120634/what-is-the-simple-way-to-find-the-column-name-from-lineageid-in-ssis/8124022#8124022
我记得说过这并没有那么难,我可以在错误重定向中编写一些脚本来从输入集合中查找列名称。
string badColumn = this.ComponentMetaData.InputCollection[Row.ErrorColumn].Name;
我了解到的是失败的专栏不在该集合中。嗯,确实如此,但是报告的 ErrorColumn 并不完全是我所需要的。我找不到那个包,但这里有一个例子说明为什么我无法获得我需要的东西。希望你会有更好的运气。
这是一个简单的数据流,一旦由于除以零而到达派生列,就会生成错误。 Derived 列生成一个新的输出列 (LookAtMe) 作为除法的结果。错误输出上的数据查看器告诉我失败的列是 73。使用上述脚本逻辑,如果我尝试访问输入集合中的列 73,它将失败,因为该列不在集合中。 LineageID 73 是 LookAtMe,LookAtMe 不在我的错误分支中,它仅在非错误分支中。
这是我的 XML 的副本,您可以看到,是的,outputColumn id 73 是 LookAtme。
<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 是异步转换 http://sqlblog.com/blogs/jorg_klein/archive/2008/02/12/ssis-lookup-transformation-is-case-sensitive.aspx。异步转换会导致数据从一组黄油复制到另一组黄油,从而导致...分配新的沿袭 ID,因此即使使用联合将两个流重新组合在一起,您也无法调用数据流链来查找原始谱系 id,因为它位于不同的缓冲区中。
在这一点上,我承认失败,并决定我可以在包中没有智能/有用的错误报告。
2012
2012 版的 SSIS 改变了他们使用 LineageID 来保持列同步的方式。它们不是将数字从源映射到接收器的组件,而是使用元素的文本表示。上面引用的 XML 现在看起来像
<outputColumn
refId="Package\DFT Generate Errors\DER Divide by SomeNumber.Outputs[Derived Column Output].Columns[LookAtMe]"
dataType="i4"
errorOrTruncationOperation="Computation"
errorRowDisposition="RedirectRow"
lineageId="Package\DFT Generate Errors\DER Divide by SomeNumber.Outputs[Derived Column Output].Columns[LookAtMe]"
name="LookAtMe"
truncationRowDisposition="FailComponent">
如果您现在查看 ErrorColumn,它们甚至没有引用文本 lineageid。相反,它们引用第 6 列。如果我搜索源 XML,我将不会在任何地方找到对第 6 列的引用。这一定是某种运行时魔法。
不幸的是,最终结果是相同的 - 您无法访问错误列,因为它是在此组件中创建的,因为它仅存在于输出列集合中。它在错误列集合中不可用。