如果缓存模式是部分缓存或没有缓存,则SSIS查找在日期时间的相等值上不匹配

时间:2018-11-19 04:01:04

标签: sql-server caching ssis lookup

我们有一个查询来匹配临时表中的传入记录,并在输入目标表之前过滤掉重复项。临时表和目标表的定义完全相同。匹配项将3列的文本,数字和日期时间类型进行比较。

它在完全高速缓存模式下可以正常工作,但是当数据增长到实际的大容量时,它将用尽内存。查找试图将整个目标表加载到内存中,并触发无休止的交换。

出于性能方面的考虑,尝试将其更改为部分缓存而没有缓存,并且更改更改的正确性是因为datetime列上的相等值不匹配,并且重复将筛选器转义到目标数据表中。

其他列为文本和数字类型,似乎没问题。仅用于测试,如果排除datetime列,则Lookup将按预期与其余列匹配。

环境是SQL Server 2016,Visual Studio 2015和Windows Server2016。并且匹配失败发生在Visual Studio调试中。如果需要,可提供更多信息,并在此先感谢。

2 个答案:

答案 0 :(得分:0)

我现在正在尝试修复,只是不确定这是否是最佳实践。我修改了SQL查询,以添加样式为121(“ yyyy-MM-dd hh:mm:ss.fff”)的字符串列(包括毫秒),然后使用字符串比较。

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

从以下链接获得答案: 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

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

答案 1 :(得分:0)

这已经是一个可行的解决方案了,但万一其他人最终来到这里并想要一个不涉及更改数据库架构的解决方案:

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

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

我的来自这个:

where [refTable].[Import_Date] = ?

为此:

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

之后一切都很好!