在SQL Server 2008中插入/更新大量数据的最佳实践

mar*_*vpc 13 sql csv feeds sql-update sql-insert

我正在建立一个通过各种CSV Feed更新大量数据的系统.通常我会循环遍历Feed中的每一行,执行select查询以检查项目是否已存在,并根据项目是否存在插入/更新项目.

我觉得这种方法的可扩展性不高,可能会使服务器在更大的源上运行.我的解决方案是正常循环项目,但将它们存储在内存中.然后,对于每100个左右的项目,对这100个项目进行选择,并获得数据库中匹配的现有项目列表.然后将insert/update语句连接在一起并将它们运行到数据库中.这基本上可以减少到数据库的行程.

这是一个可扩展的解决方案吗?是否有关于将大型Feed导入生产环境的示例教程?

谢谢

mar*_*c_s 14

看到您正在使用SQL Server 2008,我建议使用此方法:

  • 首先将CSV文件批量复制到临时表中
  • 使用MERGE命令从该临时表更新目标表

查看MSDN文档一篇关于如何使用MERGE命令的精彩博客文章.

基本上,您可以在常用条件(例如,公共主键)上创建实际数据表和登台表之间的链接,然后您可以定义在执行时要执行的操作

  • 行匹配,例如,行和目标表中都存在行 - >通常你要么更新一些字段,要么一起忽略它们
  • 来自源的行在目标中不存在 - >通常是INSERT的情况

你会有这样的MERGE声明:

MERGE TargetTable AS t
USING SourceTable AS src
ON t.PrimaryKey = src.PrimaryKey

WHEN NOT MATCHED THEN
  INSERT (list OF fields)
  VALUES (list OF values)

WHEN MATCHED THEN
  UPDATE
    SET (list OF SET statements)
;
Run Code Online (Sandbox Code Playgroud)

当然,ON如果需要,该条款可以更多地涉及.当然,你的WHEN陈述也可能更复杂,例如

WHEN MATCHED AND (some other condition) THEN ......
Run Code Online (Sandbox Code Playgroud)

等等.

MERGE 是SQL Server 2008中一个非常强大且非常有用的新命令 - 如果可以,请使用它!