【问题标题】:Insert/Update on SQL Server 2005 without using Stored Procedures在不使用存储过程的情况下在 SQL Server 2005 上插入/更新
【发布时间】:2010-09-20 15:49:58
【问题描述】:

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

我找到了一个previous question on the subject,但它处理的是我没有使用的存储过程。我只想使用普通的 SQL SELECT、INSERT 和 UPDATE 语句,除非有更好的方法可用(在 SQL Server 2005 中没有 MERGE 语句)。

我想我的总体思路是这样的:

If the row is found
  update
else
  insert

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

【问题讨论】:

    标签: sql sql-server-2005 insert-update


    【解决方案1】:

    最有效的方法是执行UPDATE,如果@@rowcount 为零,则执行INSERTas explained in this previous answer

    【讨论】:

      【解决方案2】:

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

      你可以这样做:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我发现 SQl Management studio 2008 与 SQLServer 2000 存在一些问题。如果您不需要返回那么远,仍然没有问题。
        • 在 8 月 RTM 之前,如果用户不是系统管理员,我们在连接到 SQL 2000 实例时确实会遇到问题。幸运的是,这在 RTM 版本中得到了修复。您还发现了哪些其他问题?
        【解决方案4】:

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

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

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

        【讨论】:

        • 有很多原因。就在我的脑海中:1)你可能有一个触发器,它作用于 DELETE,你不想在这种情况下被触发。 2)如果您的表使用身份,它可能应该使用,您将获得全新的身份。 3) SQL Server 不能那么容易优化。
        猜你喜欢
        • 1970-01-01
        • 2010-09-06
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        • 2013-11-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多