1

我有一組文本文件,我通過C#中的SqBulkCopy導入到SQL Server中。有一些記錄出現在多個記錄中,我想跳過這些記錄而不是拋出錯誤並停止。在SQL Server中跳過完全相同的記錄

對於有明確的'uniqueID'/主鍵的情況,一切都很好 - 我已經使用了「WITH(IGNORE_DUP_KEY = ON)」,效果很好。

在這種情況下,不能確定這樣的唯一ID,不能將所有字段連接在一起,或者創建一個涉及所有字段的複合鍵。我試圖得到一個唯一的transactionID或類似的,但沒有可用的。有時記錄是一樣的,但一個字段中的一位數字已經改變;在這種情況下,我希望它插入表中。

我認爲可能有更好的辦法比對所有領域創建一個關鍵?如果我確實這樣做了,那就意味着日期,字符串,值等都必須混合在一起才能形成關鍵。

查詢行了,用我的輸入線的哈希散列值進行比較是一種思路,但性能將是可怕的,我敢肯定:)

人對如何最好地做到這一點建議嗎?

感謝

回答

2

你可以使用EXCEPT:

insert into TargetTable 
select fieldlist from SourceTable 
except 
select fieldlist from TargetTable; 
+0

謝謝,EXCEPT看起來很理想! – Glinkot 2011-06-15 05:32:12

+0

酷...我不知道這是在SQL Server(顯然是2005+)中可用。 +1。 – codekaizen 2011-06-15 05:32:47

5

如果要導入,你可以做一個階段,其通過插入到具有相同的架構作爲目標表中的臨時表,然後在執行SELECT DISTINCT查詢去重複數據它將此查詢的結果插入到最終的目標表中。除非你正在談論數千萬行,否則這應該很好,因爲它只需要運行一次。

+0

嗨codekaizen,這將消除重複輸入文件,如果它恰好有愚弄,但我的目標,看看是否在數據庫表中存在提出輸入線(其將已經有來自其中一些文件的記錄,其中一些可能與文本文件中的記錄相同) – Glinkot 2011-06-14 06:15:55

+0

然而,你必須使用臨時表,只需添加插入主表的條件,如「not exists(select * from main table那裏......)「。 – Arvo 2011-06-14 08:50:04

+0

@Arvo是正確的 - 檢查現有的行可能是去重複後的另一個階段。目前尚不清楚您是否想要檢查傳入數據,還要檢查現有數據集。一般來說,按照這種方式分級輸入可以使未來更容易維護和添加,因爲添加了更多的需求。 – codekaizen 2011-06-14 21:33:23

相關問題