SSIS查找步骤失败,没有无意义的联盟所有步骤

时间:2011-10-25 21:09:44

标签: ssis

想象一个SSIS包,它通过列A进行查找,可以为null,如果A为空,则进行B和C列(B和C列不能为空)。就SSIS步骤而言,完成如下:

1)条件分割,条件1为“ISNULL(ColumnA)”。条件1输出名为ISNULL,默认输出名为NOTNULL。

2a)NOTNULL输出指向查找任务。查找任务执行与ColumnA的值匹配的SQL查询。它没有缓存。

2b)ISNULL输出指向查找任务。查找任务执行与ColumnB和ColumnC的值匹配的SQL查询。它也没有缓存。

3)两个查找都指向一个联合任务并继续流程。

我目前正在处理包含此工作流程的程序包,但程序包失败。提供的唯一错误消息是:

“[查找[7708]]错误:SSIS错误代码DTS_E_OLEDBERROR。发生了OLE DB错误。错误代码:0x80040E21。 OLE DB记录可用。来源:“Microsoft SQL Server Native Client 10.0”Hresult:0x80040E21说明:“输入参数值无效。请检查详细信息的状态值。”。“

奇怪的是,如果我将NOTNULL条件的输出定向到Union All任务,然后进入查找,那么一切都很完美。我不知道为什么会影响结果。似乎具有一个输入的Union All任务应该对数据没有影响。

更奇怪的是,我无法在此特定包装之外重现此问题。我尝试使用相同的源数据和相同的数据库创建具有相同工作流的示例包,并且不会抛出此错误。

我不希望任何人能够阅读此内容并立即知道问题所在。但是,我希望有人知道可能适用的SSIS已知问题,或者知道如何从该错误消息中获取更多详细信息的任何人。 (我不知道“检查详细信息的状态值”是什么意思。)

更新:按要求提供一些其他信息。

SSIS是在VS2008中运行的2008 R2版本

目标SQL Server是2008 SP2(非R2)

A列是DT_I8 / bigint,B列是DT_STR(18)/ varchar(18),C列是DT_STR(25)/ varchar(25)。

还有一条背景数据可能有助于激发新思路。此包通过尝试在具有唯一约束的表上执行OLEDB插入来工作,如果失败,则将失败行重定向到执行更新的部分。我上面描述的步骤是在插入失败后尝试执行更新的部分。如果我删除插入并直接进行更新,则包开始工作。但是,我试图在测试包中复制这一部分并且它根本没有失败,所以我不能确定这是问题。

1 个答案:

答案 0 :(得分:1)

2008年,不是2005年吗?简短的回答是我认为您的元数据被填满了。

在条件拆分操作之前右键单击绿线连接器,并记下A,B和C列的数据类型和长度/精度。与Union All的输出对比。 A的类型必须在两点之间发生变化才能表现得像这样(或者我只是赌博了一些声誉)。问题可能在数据流中更高,似乎认为它的数据类型不正确。

通常情况下,引擎很适合检测更改但有时它不会获取信号,通常是在大小发生变化且源和受影响的转换之间有一些异步组件时。

如果不是这样,那么数据流中A的数据类型是什么,此列的目标数据库(SQL Server中的数据类型是什么?)是什么,你能提供查询查询吗?此外,修改失败的查找以将错误行重定向到位桶(派生列,行计数,脚本任务)并删除数据查看器。违规行的价值是多少?这是否存在于目标数据库中?查找区分大小写,即使数据库不是。