如果缓存模式为部分缓存或无缓存,则 SSIS 查找不匹配日期时间的相等值

SSIS Lookup not matching on equal values of datetime if cache mode is partial or no cache

我们有一个查找来匹配来自临时 table 的传入记录,并在输入目标 table 之前过滤掉重复项。 temp 和 destination tables 具有完全相同的定义。匹配比较文本、数字和日期时间类型的 3 列。

它在完全缓存模式下工作正常,但当数据增长到实际大小时,它会 运行 内存不足。查找尝试将整个目标 table 加载到内存中,并触发无限交换。

为了性能尝试将其更改为部分缓存和无缓存,并且更改破坏了正确性,因为 datetime 列上的相等值无法匹配并且重复正在将过滤器转义到目标数据 table。

其他列都是text和numeric类型的,貌似没问题。仅用于测试,如果排除日期时间列,查找将按预期与其余列匹配。

环境为SQLServer 2016,Visual Studio2015,WindowsServer 2016,在Visual Studio调试时匹配失败。如果需要,可以提供更多信息,在此先感谢您。

我现在有一个暂时的修复方法,只是不确定这是否是最佳做法。我修改了 SQL 查询以添加一列样式为 121 ("yyyy-MM-dd hh:mm:ss.fff") 的字符串,包括毫秒,然后使用字符串比较。

感谢@PrabhatG 提供有关如何找出日期时间的哪一部分中断的提示,无论是日期还是一天中的时间。

从下面得到答案link: https://social.msdn.microsoft.com/Forums/en-US/a35e21cf-735c-4061-929c-b117389e38b5/ssis-lookup-not-matching-on-equal-values-of-datetime-if-cache-mode-is-partial-or-no-cache?forum=sqlintegrationservices

如果您有更好的解决方案,请与我们分享。

很久以前就没有一个有效的解决方案来回答这个问题,但如果其他人在这里结束并想要一个不涉及更改数据库模式的解决方案:

问题似乎是从 SSIS 的 DT_DBTIMESTAMP 类型转换为 SQL 的 DATETIME 类型,所以我们只需要确保它比较的值在应该是。

打开查找转换编辑器,转到“高级”选项卡,然后选中“修改 SQL 语句”。找到 WHERE 子句中进行日期比较的部分,然后更改其“?”到“转换(日期时间,?)”

我的是这样的:

where [refTable].[Import_Date] = ?

为此:

where [refTable].[Import_Date] = convert(datetime,?)

之后一切正常!