2

我正在尝试执行经典的插入/更新方案,我需要更新数据库中的现有行,或者如果它们不存在则插入它们。

在这个主题上找到了一个先前的问题,但它处理的是我没有使用的存储过程。我只想使用普通的 SQL SELECT、INSERT 和 UPDATE 语句,除非有更好的可用(SQL Server 2005 中没有 MERGE 语句)。

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

If the row is found
  update
else
  insert

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

4

4 回答 4

8

最有效的方法是执行UPDATE,然后执行INSERTif@@rowcount为零,如上一个答案中所述

于 2008-11-04T10:33:20.833 回答
0

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

你可以这样做:

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

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

于 2008-11-04T12:19:52.040 回答
0

完全理解您的帖子的标题是“SQL Server 2005”,但只是想抛出一些值得期待的东西,如果/当您升级到 SQL 2008 时。微软添加了一个新的 MERGE 语句,这将使您能够编写一个 DML 语句更新和插入。它太酷了。我还没有比较性能和 I/O,但是在您的工具箱中拥有另一个工具真是太好了。

于 2008-11-04T12:38:44.093 回答
-1

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

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

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

于 2008-11-04T12:28:26.030 回答