在不使用存储过程的情况下在SQL Server 2005上插入/更新



我正在尝试执行经典的插入/更新场景,在该场景中,我需要更新数据库中的现有行,或者在不存在行的情况下插入它们。

我发现了以前关于这个主题的一个问题,但它涉及存储过程,我没有使用它。我只想使用普通的SQL SELECT、INSERT和UPDATE语句,除非有更好的语句(MERGE语句在SQL Server 2005中不可用)。

我想我的总体想法是:

If the row is found
  update
else
  insert

至于检查行的存在,在调用UPDATE或INSERT之前执行SELECT语句的成本有多高?还是只尝试UPDATE,检查受影响的行数,然后在受影响的行将为0时执行INSERT?

最有效的方法是执行UPDATE,然后在@@rowcount为零时执行INSERT,如前面的回答所述。

(首先,如果没有充分的理由,我不会试图避免存储过程。在大多数情况下,这会带来很好的好处。)

你可以这样做:

  • 创建(临时)表
  • 填好你的行
  • 运行一个INTERSECT,用于标识正在退出的行
  • 用它们更新您的表
  • 运行标识新行的EXCEPT
  • 使用这些元素运行插入
  • 放下/清空(临时)桌子

如果要插入/更新大量的行,这可能会运行得更快。

完全理解您的文章标题是"SQL Server 2005",但只是想在升级到SQL 2008时抛出一些值得期待的东西。Microsoft添加了一个新的MERGE语句,它将使您能够编写一个DML语句来执行更新和插入。很酷。我还没有比较性能和I/O,但工具箱里有另一个工具真是太好了。

如果您总是要:
*计算行数
*根据结果插入/更新

为什么不改为:
*删除行
*插入行

同样的结果和整洁
据我所知,当你更新一行时,SQLServer无论如何都会进行删除/插入(如果它存在的话)

相关内容

  • 没有找到相关文章

最新更新