我正在复制我的答案,以便我们可以在网站上获得权威的问答
从SSIS中的Lineageid中查找列名的简单方法是什么
我记得说过这不会那么难,我可以在错误重定向中编写一些脚本来从输入集合中查找列名。
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 是一个异步转换。异步转换导致数据从一组黄油复制到另一组黄油,从而导致...分配新的沿袭 ID,因此即使使用联合将两个流重新组合在一起,您也无法调用数据流链来查找原始沿袭 id,因为它位于不同的缓冲区中。
在这一点上,我承认失败并决定我可以在我的包中没有智能/有用的错误报告。
2012
SSIS 的 2012 版本改变了他们使用 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 列的引用。这一定是一些运行时的魔法。
不幸的是,最终结果是相同的 - 您无法访问错误列,因为它是在此组件中创建的,因为它仅存在于输出列集合中。它在错误列集合中不可用。