SSIS LookUp不像文档所说的那样处理NULL

时间:2011-08-29 17:47:25

标签: sql-server-2008 sql-server-2008-r2 ssis

我有一个使用查找的SSIS数据流。有时要查找的值(在我的流中,而不是在查找表中)为空。

MSDN Docs say

  

考虑使用完全缓存,它支持对空值进行查找操作。

我正在使用完全缓存(这是默认设置)。

但是当我运行时,我的空行上出现了这个错误:

  

行在查找期间没有匹配

如果我将结果更改为忽略无匹配,那么它可以正常工作。但这忽略了所有不匹配。我只想允许空值(作为null)。任何其他不匹配都应该使组件失败。

我做错了什么?如何将空值写为空值,但不能忽略任何其他错误。

SSISFullCacheScreenshot

SSISErrorScreenshot

(注意:我已经仔细检查了我的查找表。它包含了我的源表中的所有值。它只是没有NULL作为值(因为查找null的值很奇怪。 )

4 个答案:

答案 0 :(得分:9)

我知道这是一个迟到的答案,但对于那些像我一样搜索这个问题的人,我发现这是最简单的答案:

在查找连接中,使用SQL查询检索数据并将UNION SELECT NULL, NULL添加到底部。

例如:

SELECT CarId, CarName FROM Cars 
UNION SELECT NULL, NULL

预览会在lookpup中显示另一行CarId = NullCarName = Null

答案 1 :(得分:4)

我从来没有注意到BOL中关于完整缓存模式的那一行。您的问题的答案就是您已经说过在参考数据集中使用NULL的内容。快速证明这两个样本数据流。

在这个例子中,我生成4行数据:1,2,3和NULL(Column_isNull = true)并命中一个内存表,其中包含所有值并在数据流中的Column和c1之间执行查找在内存表中定义。它如你所描述的那样爆炸

Demo data flow with failed null lookup

然后我向查找表添加了一个值,NULL和瞧,全缓存查找能够将NULL与NULL匹配。

Demo data flow with valid null lookup

外卖

要在查找组件中使NULL输入值匹配,参考数据集必须具有可用的相应NULL值,并且将缓存模式设置为FULL。

答案 2 :(得分:1)

要在SSIS中解决此问题,可以应用之前的SO answer替代方法。

在查找转换中,您可以在出错时重定向行,然后将它们传递到另一个目标,该目标可以简单地与数据库中的目标表相同。

因此,数据库中的目标表仍将接收所有行(下面的屏幕截图中为477)。

因此,这种方法避免了将虚拟NULL值放入数据库中的查找表中的需要,权衡是:

  • SSIS包中的额外步骤。
  • 错误行(在这种情况下为非NULL非匹配)将始终加载到目标表中。为了帮助识别这些rouge记录,您可以将目标表导出到txt文件中,然后使用输入源文件进行diff以查看任何差异。

SSIS Null Values in Lookup

答案 3 :(得分:0)

您可以使用条件性拆分将数据分成两组,一组给定值为空,其余为空。仅对具有非空值的输出执行查找,然后使用Union All将结果与包含空值的数据集合并。您仍然可以在查找中捕获不匹配的值,而不必担心必须在查找表中添加空条目