将数据集导入SQL Server 2008 Express

3
我有一个非常大的数据集,包含约160,000条记录。如果我循环遍历数据集并导入每个记录,那么在完整的数据集被导入到SQL Server之前可能需要大约20分钟。
难道没有更快的方式将整个数据集一次性导入数据库吗?
数据集是从用户提供的文件中处理创建的,然后我有一个名为“ImportTable”的表,其中包含大约14列。这些列对应于数据集中的列。
我使用带有C#的Visual Studio 2010专业版。
提前感谢!
3个回答

3

你应该仔细研究 SqlBulkCopy 类。

它是一个 C# 组件(无需外部应用程序),它接受 DataSet 或 DataTable 作为输入,并以批量方式将其复制到 SQL Server 中。相比逐行插入操作,速度应该要快得多...

更好的是:你甚至不需要将整个数据集导入内存 - 你可以在基础数据上定义一个 SqlDataReader,并将其传递给 SqlBulkCopySqlDataReader 中读取并批量插入到 SQL Server。


很酷,这就是我在寻找的答案... :) - CyberK

2
您可能想要查看bcp命令行实用程序。它可以让您直接从文件将数据加载到数据库中的表中。根据用户生成的文件的外观,您可能需要重新格式化它,但如果它具有简单的分隔格式,则可以直接使用bcp。原样使用

我需要从我的c#应用程序中导入它,所以我不想使用bcp工具。我已经准备好了一个DataSet,只需要导入它。 - CyberK
1
@CyberK,你是在寻求更快的解决方案。如果您不想改变您已有的东西,那么请坚持您现有的解决方案。但是,为什么要问这个问题呢?可以通过Process.Start从C#应用程序中调用bcp。保存包含160K行的数据集将导致160K个单独的插入语句。无法避开这一点。使其更快的唯一方法包括禁用表上的约束和索引,并/或升级主机服务器,减少网络延迟等。 - Klaus Byskov Pedersen

1

您可以使用 DataSet.getXml 函数生成数据集 XML,并为存储过程传递输入参数。

例如:

Create PROCEDURE dbo.MyInsertSP
(
        @strXML varchar(1000) 
)
AS
Begin
    Insert into publishers
   Select     * from OpenXml(@intPointer,'/root/publisher',2)
    With     (pub_id char(4), pub_name varchar(40), city varchar(20), 
                  state char(2),9) country varchar(20))
    exec sp_xml_removedocument @intPointer
RETURN
End

希望这有意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接