如何防止在沒有主鍵時使用SqlBulkCopy插入重複記錄

c# sql sqlbulkcopy sql-server sql-server-2008

我收到一個包含數千條記錄的每日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用於其中一些,但這取決於。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因