【问题标题】:Sql server large import without bulk copy or SSIS没有大容量复制或 SSIS 的 Sql server 大型导入
【发布时间】:2017-02-22 05:04:31
【问题描述】:

我需要每天将大约 10 万条记录导入 AWS 托管的 SQL Server Web 13.00.2164.0.v1 几十次

AWS 不支持批量插入,SQL Server Web 不支持 SSIS。

我正在使用 C# 控制台应用程序从 csv 文件中读取记录,执行一些数据转换,然后使用 SqlCommand 在每 100k 记录文件的单个事务下一次插入 1 条记录。

我目前的速度是每 30 分钟大约 25k 条记录,这似乎慢得离谱。我最初使用批量插入开发了这个过程,并且可以在大约一分钟内插入 10 万条记录。有什么办法可以加快速度吗?

【问题讨论】:

    标签: c# sql-server amazon-web-services


    【解决方案1】:

    本机方法是使用Table-Valued Parameters

    有关如何在 C# 代码中使用它们的说明,另请参阅 Table-Valued Parameters in .NET

    因此,创建一个接受表值参数并在一次调用中传递所有 100K 行的存储过程。您可以尝试尝试批量的大小并尝试更小的批量,但 100K 并不算多。

    在此存储过程中,将有一个 INSERT 语句将参数表中的行插入到永久表中。

    肯定比一次插入一行要快。

    【讨论】:

      【解决方案2】:

      您必须将数据转换为 xml 格式,然后将此 xml 数据传输到 sql。像下面的例子

      从数据集中获取数据为 xml 格式。 string objStr = ds.GetXml();//ds 是一个数据集对象,包含表数据

      在数据库结束时:

      CREATE PROCEDURE [dbo].[procedure name]
          -- Add the parameters for the stored procedure here
          @Val varchar(max) = null
      
      AS
      BEGIN
          declare @xml xml
          set @xml = convert(xml,@Val)
      
          SELECT 
              T.Node.value('colname[1]', 'numeric(18, 2)') AS colname
          FROM   
              @xmlValue.nodes('/NewDataSet/Table0') AS T(Node)
      END
      

      【讨论】:

      • 这应该很好。我计划为 SqlBulkCopy 实现一个扩展,它采用目标表名、字段映射和源表并动态构建匹配过程。感谢您朝着正确的方向推动。我会标记接受并在运行后发布我的最终结果。
      猜你喜欢
      • 1970-01-01
      • 2011-01-05
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      相关资源
      最近更新 更多