2009-01-13 52 views
3

問題:如何最有效地將數據從數組移動到SQL Server表中。從數組中獲取數據到SQLServer數據庫的最快方法?

詳細信息:我在WinForms應用程序的內存中創建了一個包含許多行(通常約爲100,000)和許多列(約40)的數組。我需要以儘可能最快的方式將此數組放入相應的SQL Server表中。現在,我創建一個SqlCommand對象,遍歷數組中的100,000行,併爲每行分配命令對象的40個參數,然後調用ExecuteCommand。它的工作原理很慢,但肯定不是最有效的方法。我應該把數組中的所有數據放入一個DataTable中,然後以某種方式一次發送數據表(我不知道該怎麼做)?還是其他一些技巧?寫出一個文件並使用bcp(看起來好像不會更快,我還沒有嘗試過)。任何建議感激!

回答

5

SqlBulkCopy。如果你可以將內存中的內容作爲DataTable存儲在內存中會更好,因爲WriteToServer()方法的重載之一會佔用一個。

編輯:Here's an example如何使用API​​。

+0

謝謝,這就是我一直在尋找的! – Rob3C 2009-01-13 22:29:29

1

我們對大批量數據使用xml。將xml字符串傳遞到存儲過程,並讓sp將xml分解成一個表。然後從臨時表中選擇你的數據庫。似乎爲我們工作得很好。

編輯:如下面的評論所述,將xml轉換爲表的過程是sp_xml_preparedocument

declare @idoc int 
exec sp_xml_preparedocument @idoc output, @input_xml 
-- select into a tmp table from openxml(@idoc, 'xpath_to_your_data') 
exec sp_xml_removedocument @idoc 
+0

您知道SQL Server可以直接將XML讀取到表中,對嗎?沒有必要有一個存儲過程來解析XML。看看sp_xml_preparedocument。 – 2009-01-13 20:34:47

+0

sp_xml_preparedocument是我們使用的。但我認爲'sp'代表存儲過程,因此暗示它確實是一個存儲過程。我只是不記得名字。感謝您的澄清。 – 2009-01-15 21:20:07

1

皮納爾戴夫有一個odd method of performing a bulk insert我讀到就在幾天前:

INSERT INTO MyTable (FirstCol, SecondCol) 
    SELECT 'First' ,1 
    UNION ALL 
SELECT 'Second' ,2 
    UNION ALL 
SELECT 'Third' ,3 
... 

考慮您的大數據集,可能會嘗試只是爲了看看會發生什麼。

0
  • 在winforms應用程序的數據表中顯示數據。
  • 將數據複製到Excel(或OpenOffice Calc)。
  • 保存文件。
  • 使用數據導入工具來拉取數據並映射字段。

你會在15分鐘內完成。

編輯:呃,這可能不適用於100k行。但是在更復雜的事情發生之前,它很快,很容易,值得一試。

相關問題