Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SSIS错误中查找转换:不阻止插入已存在的记录_Sql Server_Ssis_Etl_Lookup - Fatal编程技术网

Sql server 在SSIS错误中查找转换:不阻止插入已存在的记录

Sql server 在SSIS错误中查找转换:不阻止插入已存在的记录,sql-server,ssis,etl,lookup,Sql Server,Ssis,Etl,Lookup,我有一个SSIS包,它从源读取数据,执行查找转换以检查目标中是否存在记录,如果存在记录,它将重定向到匹配输出并更新它,否则将重定向到不匹配输出并插入它。问题是,有时它会插入一条应该重定向以进行更新的记录。这是通过作业完成的,如果我手动执行包,一切都很好。使用匹配列正确设置了查找组件 我不知道为什么会发生这种情况,最愚蠢的是我无法调试它,因为手动操作一切正常 有什么想法吗 I上有两个选项,其中包含本应更新的插入内容 重复源值 首先,源数据中有重复的键,而目标表中没有 源数据 目的地数据 在这种情况

我有一个SSIS包,它从源读取数据,执行查找转换以检查目标中是否存在记录,如果存在记录,它将重定向到匹配输出并更新它,否则将重定向到不匹配输出并插入它。问题是,有时它会插入一条应该重定向以进行更新的记录。这是通过作业完成的,如果我手动执行包,一切都很好。使用匹配列正确设置了查找组件

我不知道为什么会发生这种情况,最愚蠢的是我无法调试它,因为手动操作一切正常


有什么想法吗

I上有两个选项,其中包含本应更新的插入内容

重复源值 首先,源数据中有重复的键,而目标表中没有

源数据 目的地数据 在这种情况下,假设在包开始执行之前,查找组件的默认行为为full cache,SSIS将运行查找引用表的源查询。只有缓存了所有查找表数据后,数据流才会成为流动数据

  • 第一行,A:abc点击查找。不,没有数据,关闭插入路径
  • 第二行B:bcd点击查找。不,没有数据,关闭插入路径
  • 第三行A:cde点击查找。不,没有数据,关闭到插入路径(希望是主/唯一密钥冲突)
当包启动时,它只知道目标表中的数据。在运行期间,您向表中添加了相同的键值,但从未要求查找组件检查更新

在这种情况下,有两种解决方案:第一种是将缓存模式从完全更改为无(或部分)。这将使lookup组件针对流经数据流的每一行的目标表发出查询。对于大行来说,这可能会很昂贵。它也不会是傻瓜式的,因为数据流有缓冲区的概念,在我们的示例3行加载的情况下,这些都可以放在一个缓冲区中。缓冲区中的所有行几乎同时命中查找,因此当第三行流经组件时,目标表仍然不包含A值。您可以通过将缓冲区大小调整为1来阻止数据流并强制它一次处理一行,但这通常不是一个好的解决方案

另一个解决方案是重复数据消除/处理生存性。如果我们的源对同一个业务键有不同的值,那么应该将哪一行放到数据库中?首先,最后,选一个?如果无法在数据到达数据流之前消除数据,则需要使用聚合组件消除重复数据,以尽可能地汇总数据

区分大小写的查找 源数据 目的地数据 另一种情况是,查找组件会咬到您,默认的完全缓存匹配基于.NET字符串匹配规则。因此,AAA并不等于AAA。如果查找正在进行字符串匹配,即使数据库不区分大小写,SSIS查找也不会不区分大小写

在需要匹配alpha数据的情况下,我通常在源数据中创建一个额外/重复的列,它是所有大写或小写的关键数据。如果我正在查询数据,我会将其添加到查询中。如果从平面文件加载,则使用派生列组件将列添加到数据流中

然后,我确保在使用查找组件时,引用表中的数据大小写相同

查找组件警告 完全缓存模式: -对参考数据的更改不敏感 -区分大小写的匹配 -总体而言,速度更快 -延迟数据流,直到查找数据被缓存 -NULL匹配空字符串 -缓存的数据需要RAM

无缓存模式: -对参考资料的变化敏感 -区分大小写匹配基于查找系统的规则(DB区分大小写,您得到的是区分大小写的匹配) -这取决于(100行源数据,1000行参考数据-没有人会注意到)。 1B行源数据和10B行参考数据-有人会注意到。是否有支持查找的索引等) -NULL不匹配任何内容 -没有明显的SSIS内存开销

部分缓存: 部分缓存与No-cache选项基本相同,不同之处在于,一旦获得与引用表的匹配,它将缓存该值,直到执行结束或由于内存压力而被推出


您的数据输入是否正确排序?@iamdave不正确,我是从暂存表中读取的。但是,根据主键,加载暂存的表具有一定的顺序。根据
查找中使用的键值对
OleDB源中的输入数据进行排序。用于匹配的列的数据类型和查找的缓存模式是什么?日复一日,当我看到有价值的答案时,我感到沮丧已被忽略+1我正在使用完全缓存模式,我认为没有足够的内存来缓存目标表中的所有数据,因此它会看到某些行不存在。。。
Key|Value
A  |abc
B  |bcd
A  |cde
Key|Value
C  |yza
B  |zab
Key|Value
A  |abc
B  |bcd
a  |cde
Key|Value
C  |yza
B  |zab