我有一个使用查找的SSIS数据流。有时要查找的值(在我的流中,而不是在查找表中)为空。
考虑使用完全缓存,它支持对空值进行查找操作。
我正在使用完全缓存(这是默认设置)。
但是当我运行时,我的空行上出现了这个错误:
行在查找期间没有匹配
如果我将结果更改为忽略无匹配,那么它可以正常工作。但这忽略了所有不匹配。我只想允许空值(作为null)。任何其他不匹配都应该使组件失败。
我做错了什么?如何将空值写为空值,但不能忽略任何其他错误。
(注意:我已经仔细检查了我的查找表。它包含了我的源表中的所有值。它只是没有NULL作为值(因为查找null的值很奇怪。 )
答案 0 :(得分:9)
我知道这是一个迟到的答案,但对于那些像我一样搜索这个问题的人,我发现这是最简单的答案:
在查找连接中,使用SQL查询检索数据并将UNION SELECT NULL, NULL
添加到底部。
例如:
SELECT CarId, CarName FROM Cars
UNION SELECT NULL, NULL
预览会在lookpup中显示另一行CarId = Null
和CarName = Null
。
答案 1 :(得分:4)
我从来没有注意到BOL中关于完整缓存模式的那一行。您的问题的答案就是您已经说过在参考数据集中使用NULL的内容。快速证明这两个样本数据流。
在这个例子中,我生成4行数据:1,2,3和NULL(Column_isNull = true)并命中一个内存表,其中包含所有值并在数据流中的Column和c1之间执行查找在内存表中定义。它如你所描述的那样爆炸
然后我向查找表添加了一个值,NULL和瞧,全缓存查找能够将NULL与NULL匹配。
要在查找组件中使NULL输入值匹配,参考数据集必须具有可用的相应NULL值,并且将缓存模式设置为FULL。
答案 2 :(得分:1)
要在SSIS中解决此问题,可以应用之前的SO answer替代方法。
在查找转换中,您可以在出错时重定向行,然后将它们传递到另一个目标,该目标可以简单地与数据库中的目标表相同。
因此,数据库中的目标表仍将接收所有行(下面的屏幕截图中为477)。
因此,这种方法避免了将虚拟NULL值放入数据库中的查找表中的需要,权衡是:
答案 3 :(得分:0)
您可以使用条件性拆分将数据分成两组,一组给定值为空,其余为空。仅对具有非空值的输出执行查找,然后使用Union All将结果与包含空值的数据集合并。您仍然可以在查找中捕获不匹配的值,而不必担心必须在查找表中添加空条目