2011-06-19 43 views
11

我想插入許多行(從實體框架對象構建)到SQL Server。問題是,一些字符串屬性的長度超過了數據庫中列的長度,這會導致異常,然後所有行都無法插入到數據庫中。如何在批量插入時自動截斷字符串?

所以我想知道是否有辦法告訴SqlBulkCopy自動截斷任何超長的行?當然,如果超過限制的長度,我可以檢查每個屬性並對其進行子字符串處理,然後將其插入DataTable中,但會降低整個程序的速度。

回答

7

遺憾的是沒有直接這樣做的方式與SqlBulkCopy。 SQL Bulk Insert本質上幾乎是「愚蠢的」,但這就是爲什麼它們如此之快。他們甚至沒有記錄(除了捕獲SqlRowsCopied事件),所以如果失敗了,沒有太多的信息。你正在尋找會的方式,會適得其反這一類

的目的,但可以有2點可能的方式:

  • 您可以嘗試使用SqlBulkCopyOptions枚舉(傳遞給SqlBulkCopy() Constructor)和使用SqlBulkCopyOptions.CheckConstraints(在插入數據時檢查約束,默認情況下不檢查約束)。

  • 或者你可以使用SqlBulkCopyOptions.FireTriggers枚舉(如果指定,導致服務器消防插入觸發器被插入到數據庫中的行。)並處理在SQL Server Insert Trigger例外。

+1

-1觸發器會觸發太晚:截斷髮生在代碼運行之前。檢查仍然會發出異常。 Op回到了他們開始的地方。 – gbn

+1

+0.5?使用INSTEAD OF INSERT觸發器,您可以修剪插入的數據,但臨時表是更好的路徑。 – SqlACID

9

始終對批量操作使用登臺/裝載表。

然後你可以在沖洗到真正的表格之前處理,清理,擦洗等數據。這包括左派,查找,去重複等

所以:

  1. 加載到 「真正的」 表使用INSERT realtable (..) SELECT LEFT(..), .. FROM Staging
-1
一個臨時表與
  • 從登臺同花順

    嘗試在使用SQLBulkCopy時使用SQLTransaction類