UPSERT - 有没有更好的替代 MERGE 或 @@rowcount 的方法?

Pre*_*cco 15 sql-server-2008 upsert

不知道大家有没有遇到过类似UPSERT这个概念的T-SQL命令?使用选项 (1) 或 (2) 执行 INSERT|UPDATE 操作似乎过于复杂且容易出错。

客观的

确保所需的记录(在本例中为 employee_id 1)是最新的,而不必实质上编写相同的查询两次。

语境

  • 表名:员工
  • 员工id:有主键,身份属性设置为true

选项

  1. 执行 SQL UPDATE... 检查 @@rowcount = 0 和 @@error = 0 ... 如果需要,执行 SQL INSERT

    • 缺点:您实际上必须两次编写相同的查询,一次作为插入,一次作为更新
    • con: more code = more time typing
    • con: more code = more room for error

/sf/ask/77470221/ "Update using @@rowcount"

  1. execute a SQL MERGE
    • con: you effectively have to write the same query twice, once as an insert, once as an update
    • con: more code = more time typing
    • con: more code = more room for error

http://technet.microsoft.com/en-us/library/bb510625.aspx "T-SQL Merge"

  1. execute a SQL UPSERT (feature does not exist)
    • pro: you define the data-to-table relationship once (let SQL Server worry about whether or not it is an INSERT or an UPDATE)
    • pro: less code = faster implementation
    • pro: less code = lower probability

UPSERT EXAMPLE

UPSERT 员工 (employee_id、employee_number、job_title、first_name、middle_name、surname、modified_at) VALUES (1, '00-124AB37', 'Manager', 'John', 'T', 'Smith', GetDate());

  • 如果 employee_id 1 不存在:MS SQL 执行 INSERT 语句
  • 如果 employee_id 1 存在:MS SQL 执行和 UPDATE 语句

Aar*_*and 14

我认为对此的简单答案是否定的。MERGE是微软对更复杂的UPSERT逻辑的回答。你甚至没有列出最糟糕的方法:

IF (SELECT COUNT ... ) > 0
    UPDATE
ELSE
    INSERT
Run Code Online (Sandbox Code Playgroud)

我只是在嘴里吐了一点打字,但这实际上是我最常看到的。

在任何情况下,如果MERGE对您来说不够灵活或不够强大,我建议您通过http://connect.microsoft.com/sql/向 Microsoft 提交功能请求,并彻底解释您的业务案例。只要你坚持你提议的语法的真正优势,你MERGE就会得到我的投票。如果你太在意“容易出错”的部分,我就不太可能买账了。为什么?因为你可以胖手指任何语句。

也就是说,我认为这里没有任何人可以专门为您做任何事情。您应该调查潜在的问题MERGE

http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/

  • 谢谢亚伦。我浏览了 MSDN 上的 T-SQL 文档,但找不到我要找的东西;只是想我会把它扔在那里,以防我错过了什么。虽然 MERGE 语句在某些情况下有意义,但我不禁觉得它是一个简单的保存操作的“大锤敲钉子”的解决方案。也许我应该摘下我的程序员帽子,戴上我的 DBA Fedora。感谢您抽出宝贵时间分享您的想法。 (2认同)