在SSIS中从Lineageid中查找列名的简单方法是什么?有没有可用的系统变量?
发布于 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。
<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,因为它位于不同的缓冲区中。
在这一点上,我承认失败了,并决定我可以在我的包中没有智能/有用的错误报告。
发布于 2014-11-19 04:51:18
我知道这是一个很长的死线,但我偶然发现了这个问题的手动解决方案,并认为我会分享给任何遇到同样问题的人。诚然,这不能提供问题的程序化解决方案,但对于简单的调试,它应该可以做到这一点。该解决方案使用派生列作为示例,但这似乎适用于任何数据流组件。
来自 的答案,由Todd McDermid提供
"...不幸的是,列的沿袭ID很好地隐藏在SSIS中。它是SSIS用来标识列的“键”。因此,为了确定是哪一列,您需要打开派生列组件或数据转换的高级编辑器。右键单击并选择“高级编辑器”即可完成此操作。转到“输入和输出属性”选项卡。打开第一个节点-“派生列输入”或“数据转换输入”。打开“输入列”选项卡。单击各个列,注意每个列的"LineageID“属性。您可能需要对“派生列输出”节点和其中的“输出列”执行相同的操作。与您记录的谱系ID匹配的列是违规列。“
发布于 2018-10-10 16:54:28
对于使用SS2016之前的SQL Server版本的任何人,这里有几个参考链接,提供了获取列名的方法:
它基于:http://toddmcdermid.blogspot.com/2016/04/finding-column-name-for-errorcolumn.html
我很欣赏我们不应该仅仅发布链接,但这个解决方案相当复杂,我试图通过从Todd和Andrew的博客帖子中提取信息并在这里重新创建它们来总结。(如果你读过这篇文章,谢谢你们!)
在Todd的页面上:
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编号转换为有意义的列名。
但是对于那些想要理解上面的脚本的人来说:
来自Andrew页面的图片和文本有助于更详细地解释它:
然后,将此映射与沿着错误路径下行的ErrorColumn谱系ID进行合并连接,以便可以将错误信息附加到映射中的列名。我包含了第二个脚本组件,它从错误代码中查找错误描述,因此我们在上面看到的错误表行同时包含列名和错误描述。
需要解释的其余组件是条件拆分-它的存在只是为了向创建地图的脚本组件提供元数据。我创建了一个表达式(1 == 0),对于“no Rows - Metadata Only”路径,该表达式的计算结果始终为false,因此不会有任何行沿着该路径传播。
虽然这个解决方案确实需要在数据流中插入一些额外的管道,但当确实发生错误时,我们会获得非常有价值的信息。因此,特别是当数据流在生产中无人值守运行时-当我们在设计时没有可用的工具和技术来找出问题所在时-与简单地给出失败的数据并让我们找出为什么被拒绝相比,日志记录为我们提供了关于哪里出了问题以及为什么出了问题的更准确的信息。
https://stackoverflow.com/questions/8120634
复制相似问题