我收到一个包含数千条记录的每日XML文件,每条记录都是一个商业交易,我需要将其存储在内部数据库中,以便用于报告和计费。我的印象是每天的文件只包含唯一的记录,但发现我对unique的定义与提供者的定义并不完全相同。
导入此数据的当前应用程序是C#.Net 3.5控制台应用程序,它使用SqlBulkCopy进入MS SQL Server 2008数据库表,其中列与XML记录的结构完全匹配。每个记录只有100多个字段,并且数据中没有自然键,或者更确切地说,我可以想出的字段,因为复合键最终也必须允许空值。目前该表有几个索引,但没有主键。
基本上整行必须是唯一的。如果一个字段不同,则有效插入。我看了创建整个行的MD5哈希,将其插入数据库并使用约束来阻止SqlBulkCopy插入行,但我不知道如何将MD5哈希进入BulkCopy操作而我不是确定整个操作是否会失败并在任何一个记录失败时回滚,或者它是否会继续。
该文件包含大量记录,在XML中逐行进行,查询数据库以查找与所有字段匹配的记录,然后决定插入实际上是我能够看到能够执行此操作的唯一方法。我只是希望不必完全重写应用程序,并且批量复制操作要快得多。
有没有人知道一种方法来使用SqlBulkCopy,同时防止重复行,没有主键?或者以不同的方式做任何建议吗?
什么是数据量?你有两个我可以看到的选项:
1:在源头过滤它,通过实现自己的IDataReader
并对数据使用一些哈希,并简单地跳过任何重复项,以便它们永远不会传递到TDS。
2:在DB中过滤它;在最简单的层面上,我猜你可能有多个导入阶段 - 原始的,未经过数据处理的数据 - 然后将DISTINCT
数据复制到您的实际表中,如果您愿意,可以使用中间表。您可能希望将CHECKSUM
用于其中一些,但这取决于。