2011-12-20 76 views
2

我有大約20個.csv文件,每個文件大約100-200mb。如何將20個100mb的CSV文件批量插入到SQL Server中

它們每個都有大約100列。

每個文件的90%的列是相同的;但是,某些文件的列數更多,而某些文件的列數更少。

我需要將所有這些文件導入到sql server 2008數據庫中的一個表中。

如果該字段不存在,我需要它被創建。

問題:這個導入過程應該是什麼?如何更有效和快速地將所有這些文件導入到數據庫中的一個表中,並確保如果一個字段不存在,那麼它會被創建?請注意,同一字段可能是位於不同的位置。例如,CAR可以在一個csv中的字段AB中,而在另一個csv文件中相同的字段名稱(CAR)可以是AC。解決方案可以是SQL或C#或兩者。

+3

使用SSIS包。 – Maess 2011-12-20 19:20:56

+0

這是一件持續的事情嗎?或一次導入? – 2011-12-20 19:22:52

+0

@john這將是一次 – 2011-12-20 19:28:16

回答

3

您可以選擇多個選項 1.使用DTS包 2.嘗試產生一個統一的CSV文件,讓db表在其列,並批量同步插入 3.批量插入每一個文件它自己的表,然後將這些表合併到目標表中。

+0

我愛你的建議#3。你能告訴我如何結合三張桌子? – 2011-12-20 19:28:48

+0

當然 - 手動 – 2011-12-20 19:30:54

+1

我也喜歡你的#3 +1 – Bengie 2011-12-20 19:31:22

1

我建議寫一個小的C#的應用程序,讀取每個CSV文件報頭的,並存儲所需的列的字典,要麼輸出「穿心蓮e表'語句或直接在數據庫上運行創建表操作。然後,您可以使用Sql Management Studio使用導入例程單獨加載20個文件。

1

使用SqlBulkCopy類在System.Data.SqlClient的

它有利於批量數據傳輸。只捕獲它不會與DataTime數據庫列

1

有幾種可能性,你在這裏。

  • 如果可以使用SSIS,則可以使用SSIS。
  • 在SQL Server中,您可以使用SqlBulkCopy的批量插入到一個臨時表中,您將插入整個.csv文件 ,然後在它使用存儲過程有可能MERGE聲明 放置的每一行,它屬於或創建新的,如果它不存在 。
  • 您可以使用C#代碼來讀取文件,並使用SqlBulkInsert或EntityDataReader
1

答案的少,更多的是方向的寫出來,但在這裏,我走了。我會這樣做的方式是首先枚舉CSV文件和數據庫中的列名,然後確保CSV中的所有列都存在於目標中。

一旦你驗證和/或創建了所有的列,那麼你可以做你的批量插入。假設您沒有同時進行多個導入,您可以在開始導入時從數據庫緩存列名,因爲它們不應該更改。

如果您將有多個導入同時運行,那麼您需要確保在導入過程中有一個完整的表鎖,因爲競態條件可能會顯示。

我爲SQL DB做了大量的自動導入操作,而且我從未見過你問過的內容,因爲假定需要知道進入數據庫的數據。提前不知道列通常是一件非常糟糕的事情,但它聽起來像是對規則有例外。

+1

我在財務上見過這個確切的例子。我並不感到驚訝。但是,是的,這很煩人/尷尬。 – 2011-12-20 19:33:12

0

對於那些數據卷,您應該使用ETL。 See this tutorial

ETL設計用於大量的數據處理

+0

很高興知道爲什麼downvote ......快速評論可以幫助;) – Romias 2011-12-20 19:34:05

1

滾動你自己的。

保留(或創建)數據庫中目標表的列的運行時表示。在導入每個文件之前,請檢查列是否已經存在。如果沒有,請運行適當的ALTER語句。然後導入該文件。

實際的導入過程可以也可能應該由BCP或任何您可用的批量協議完成。由於源數據和目的地僅在邏輯上對齊,而不是物理上對齊,所以您將不得不做一些奇特的加逗號。所以你需要BCP格式的文件。