2012-05-24 106 views
11

我有接收數據流格式如下批量插入SQL服務器數以百萬計的記錄

IDX|20120512|075659|00000002|3|AALI     |Astra Agro Lestari Tbk.          |0|ORDI_PREOPEN|12 |00000001550.00|00000001291.67|00001574745000|00001574745000|00500|XDS1BXO1|          |00001574745000|ݤ 
IDX|20120512|075659|00000022|3|ALMI     |Alumindo Light Metal Industry Tbk.       |0|ORDI  |33 |00000001300.00|00000001300.00|00000308000000|00000308000000|00500|--U3---2|          |00000308000000|õÄ 

該數據來自於數百萬行和序列00000002....00198562 Windows服務應用程序,我必須分析和將它們按照順序插入到數據庫表中。

我的問題是,將這些數據插入到我的數據庫中的最佳方式(最有效)是什麼?我試圖用一個簡單的方法來打開一個SqlConnection對象,然後生成一個SQL插入腳本的字符串,然後使用SqlCommand對象執行腳本,但是這個方法耗時過長。

我讀過我可以使用Sql BULK INSERT,但它必須從文本文件中讀取,這種情況下是否可以使用BULK INSERT? (我以前從未使用過)。

謝謝

更新:我知道SqlBulkCopy的,但它要求我有數據表第一,這是很好的表現?如果可能,我想直接從我的數據源插入到SQL Server,而不必在內存中使用DataTable。

+3

「按照順序插入」是什麼意思?爲什麼插入行的順序很重要?無論插入順序如何,它們都按照[聚簇索引](http://msdn.microsoft.com/zh-cn/library/aa933131.aspx)中指定的順序存儲。 –

回答

22

如果您使用C#編寫此代碼,您可能需要查看SqlBulkCopy類。

可讓您有效地批量加載SQL Server表與其他來源的數據。

+2

;)令人驚訝的是,人們應該永遠不會看文檔 - SqlBUlkCopy至少可以檢查出來。注意:編寫一個允許SqlBulkCopy使用枚舉對象作爲數據源的轉換器很簡單(一小時);) – TomTom

+0

嗨,Mark,感謝您的回答,我已更新了我的問題。你能評論一下嗎?謝謝。 – Arief

+2

請參閱@ TomTom的評論。 – zmbq

0

您可以使用SSIS「SQL Server集成服務」將數據從源數據流轉換爲遠程數據流。 來源可以是文本文件和目標可以是SQL Server表文件。並在批量插入模式下轉換執行。

+0

爲什麼每個單詞都大寫? – Liam

3

首先,免費下載LumenWorks.Framework.IO.Csv庫。

其次,使用這樣的代碼

StreamReader sr = new TextReader(yourStream); 
var sbc = new SqlBulkCopy(connectionString); 
sbc.WriteToServer(new LumenWorks.Framework.IO.Csv.CsvReader(sr)); 

是的,這是真的那麼容易。

+1

我正在尋找一個圖書館,處理帶有嵌入引號和換行符的CSV字段。這個CSVReader是完美的,並且可以輕鬆插入到SqlBulkCopy中。現在我只能使用幾行代碼每分鐘加載數百萬行。感謝分享。 – Martin

+0

嗨,如何插入值與檢查?例如我想檢查記錄是否存在或不在數據庫中,如果存在我想追加到其他表 –

+1

@NitinSawant它不會是* bulk *插入任何更多。但經常一個一個。 –