2009-01-13 127 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行。但是在更复杂的事情发生之前,它很快,很容易,值得一试。

相关问题