我正在尝试执行经典的插入/更新场景,在该场景中,我需要更新数据库中的现有行,或者在不存在行的情况下插入它们。
我发现了以前关于这个主题的一个问题,但它涉及存储过程,我没有使用它。我只想使用普通的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无论如何都会进行删除/插入(如果它存在的话)