我正在尝试执行经典的插入/更新场景,其中我需要更新数据库中的现有行或插入它们(如果它们不存在)。

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

我想我的总体想法是这样的:

If the row is found
  update
else
  insert

至于检查行​​是否存在,在调用 UPDATE 或 INSERT 之前执行 SELECT 语句的成本有多大?或者最好尝试执行 UPDATE,检查受影响的行数,然后在受影响的行数为 0 时执行 INSERT?

有帮助吗?

解决方案

最有效的方法是 UPDATE, ,然后做一个 INSERT 如果 @@rowcount 为零, 正如之前的答案中所解释的.

其他提示

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

你可以这样做:

  • 创建一个(临时)表
  • 填写您的行
  • 运行识别现有行的 INTERSECT
  • 用它们更新你的桌子
  • 运行识别新行的 EXCEPT
  • 使用这些元素运行插入
  • 删除/清除您的(临时)表

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

完全理解您的帖子标题为“SQL Server 2005”,但只是想在升级到 SQL 2008 时抛出一些值得期待的内容。Microsoft 添加了一个新的 MERGE 语句,它使您能够编写一个同时执行更新和插入操作的 DML 语句。它太酷了。我还没有比较性能和 I/O,但如果您的工具箱中有另一个工具,那就太棒了。

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

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

相同的结果并且更整洁。
据我所知,当您更新一行时 - SQLServer 无论如何都会执行删除/插入(如果存在)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top