SqlBulkCopy錯誤處理/繼續錯誤

ado.net c# sqlbulkcopy

我試圖將大量數據插入SQL服務器。我的目標表有一個名為“Hash”的唯一索引。

我想用SqlBulkCopy替換我的SqlDataAdapter實現。在SqlDataAapter中有一個名為“ContinueUpdateOnError”的屬性,當設置為true時,adapter.Update(table)將插入所有可能的行並使用RowError屬性標記錯誤行。

問題是我如何使用SqlBulkCopy盡可能快地插入數據,同時跟踪哪些行被插入以及哪些行沒有(由於唯一索引)?

以下是其他信息:

  1. 該過程是迭代的,通常按計劃重新設定。

  2. 源表和目標表可能很大,有時可能有數百萬行。

  3. 儘管可以首先檢查哈希值,但每行需要兩個事務(首先從目標表中選擇哈希,然後執行插入)。我認為在adapter.update(table)的情況下,檢查RowError比檢查每行的哈希命中要快。

一般承認的答案

SqlBulkCopy具有非常有限的錯誤處理功能,默認情況下它甚至不檢查約束。

但是,它速度快,真的非常快。

如果要解決重複鍵問題,請確定批處理中哪些行是重複的。一種選擇是:

  • 開始轉
  • 在表格上抓一個tablockx選擇所有當前的“Hash”值並將它們放入HashSet中。
  • 過濾掉重複項並報告。
  • 插入數據
  • commit tran

如果要插入大型集合併且表中初始數據的大小不是太大,則此過程將有效。

您能否請擴展您的問題以包括問題的其餘部分。

編輯

現在我在這裡有更多的上下文是你可以採取的另一種方式:

  • 將批量插入放入臨時表中。
  • 啟動serializable tran
  • 選擇目標表中已有的所有臨時行...報告它們
  • 將臨時表中的數據插入到真實表中,在哈希上執行左連接並包括所有新行。
  • 提交tran

這個過程在往返旅行中非常輕鬆,並且考慮到你的規格應該最終真的很快;


熱門答案

與已經提出的方法略有不同;執行SqlBulkCopy並捕獲拋出的SqlException

    Violation of PRIMARY KEY constraint 'PK_MyPK'. Cannot insert duplicate 
key in object 'dbo.MyTable'. **The duplicate key value is (17)**.

然後,您可以從ID 17(第一個重複的記錄)中刪除源中的所有項目。我在這裡做的假設適用於我的情況,可能不適合你的情況;即複製是由完全相同的數據從先前失敗導致SqlBulkCopy由於在上載過程SQL /網絡錯誤。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow