MS SQL 批量更新\插入

Posted

技术标签:

【中文标题】MS SQL 批量更新\\插入【英文标题】:MS SQL Bulk update\insertMS SQL 批量更新\插入 【发布时间】:2015-07-18 05:05:05 【问题描述】:

前段时间我们遇到了批量插入\更新到 MS SQL 数据库的问题。

任务非常简单——从数据库中检索数据、执行数据转换、更新父表并填写子表。数据量巨大,这就是我们对最高效的方式感兴趣的原因。 DB 中的所有操作(存储过程、文件处理等)都不适用,因为我们需要从第三方应用程序中获取信息。

虽然在互联网上你可以找到很多关于如何禁用自动提交和执行批量插入\更新的文章,但无论如何它都会一个接一个地发送请求。 这适用于大多数免费的 jdbc 驱动程序,包括最流行的一个 - net.sourceforge.jtds.jdbc.Driver (http://sourceforge.net/p/jtds/discussion/129584/thread/8e89906c/)。 可能 DataDirect 支持这样的功能,但它不是免费的。 FIY-List of JDBC drivers for SQL Server 2008 (comparison)。

请分享解决类似问题的经验。

最好的问候, 亚历克斯

【问题讨论】:

如果您正在分享知识,那么您可以将解决方案部分从问题中拆分出来,并将其添加为您自己的答案 @Nimesh,感谢您的评论。发布更新 【参考方案1】:

我们以其他方式解决了这个问题。由于我们需要批量执行 2 条数据修改(插入新的子记录并使用某些字段更新现有父记录),因此我们重写查询以执行此操作:

更新:

 UPDATE ParentTable SET DeviceInformation = dual.DeviceInformation FROM ParentTable ptb 
  JOIN ( values (1, 'info1'), (2, 'info2')) as dual (ParentTableID, DeviceInformation) 
  ON  ptb.ParentTableID = dual.ParentTableID

INSERT 的想法相同:

    INSERT INTO dbo.ChildTable 
      (ChildId, ChildNumber, Info) 
      values (1, 1, 'some text'), (2, 2, 'some text2')

它为我们带来了显着的性能提升,因为大部分时间都花在了连接建立上。

希望对您有所帮助。

【讨论】:

以上是关于MS SQL 批量更新\插入的主要内容,如果未能解决你的问题,请参考以下文章

sql server有批量插入和批量更新的sql语句吗

MS SQL 技巧总结--持续更新

sql mysql批量插入,具有重复键更新(upsert),并具有条件数据更新

MS SQL 批量给存储过程/函数授权

使用 Petapoco 批量插入/更新

关于SQL数据库批量更新和增加的问题。