在 SQL Server 2005 上插入/更新而不使用存储过程
-
06-07-2019 - |
题
我正在尝试执行经典的插入/更新场景,其中我需要更新数据库中的现有行或插入它们(如果它们不存在)。
我找到了一个 关于该主题的上一个问题, ,但它涉及存储过程,我没有使用它。我只想使用普通的 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 无论如何都会执行删除/插入(如果存在)
不隶属于 StackOverflow