UPSERT-MERGE或@@ rowcount是否有更好的替代方法?[关闭]


14

我想知道您是否遇到过类似于UPSERT概念的T-SQL命令?使用选项(1)或(2)执行INSERT | UPDATE操作似乎过于复杂且容易出错。

目的

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

语境

  • 表名:员工
  • 员工编号:具有主键,并且身份属性设置为true

选项

  1. 执行SQL UPDATE ...检查@@ rowcount = 0和@@ error = 0 ...根据需要执行SQL INSERT

    • 缺点:您实际上必须两次编写相同的查询,一次作为插入,一次作为更新
    • 缺点:更多的代码=更多的输入时间
    • 缺点:更多代码=更多错误空间

/programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure “使用@@ rowcount更新”

  1. 执行一个SQL MERGE
    • 缺点:您实际上必须两次编写相同的查询,一次作为插入,一次作为更新
    • 缺点:更多的代码=更多的输入时间
    • 缺点:更多代码=更多错误空间

http://technet.microsoft.com/zh-cn/library/bb510625.aspx “ T-SQL合并”

  1. 执行SQL UPSERT(功能不存在)
    • 专家:您一次定义了数据与表的关系(让SQL Server担心它是INSERT还是UPDATE)
    • 优点:更少的代码=更快的实现
    • 优点:更少的代码=更低的概率

UPSERT示例

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

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

4
这似乎是Microsoft的一项功能请求,但这里没有任何人可以帮助您解决。Microsoft提出的解决方案是MERGE。如果那对您来说不够灵活/功能强大,那么您需要一个尚不存在的其他解决方案。
亚伦·伯特兰

3
在我看来,MERGE它简单,灵活,并且也是SQL Standard的一部分。MERGE和其他UPSERT实现的真正问题是潜在的锁升级甚至死锁,这与语法无关。
2012年

如果您有任何疑问,请随时提出。就本文而言,这基本上是有关MERGESQL Server中实现的一个讽刺。
JNK 2012年

好的问题-本质上是UPSERT语句,服务器在其中担心它是否需要插入或更新。我同意,MERGE不符合您对实现“ UPSERT”的逻辑期望。考虑到MS选择以这种方式实现,我的问题是:如果他们尝试实现您(和我)想要的语法,那可能是一个缺点,或者不可能实现?
youcantryreachingme

Answers:


14

我认为对此的简单答案是“否”。MERGE微软对更复杂UPSERT逻辑的回答。而且您甚至没有列出最差的方法:

IF (SELECT COUNT ... ) > 0
    UPDATE
ELSE
    INSERT

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

无论如何,如果MERGE您不够灵活或功能不足,我建议您通过http://connect.microsoft.com/sql/向Microsoft提交功能请求,并彻底解释您的业务案例。只要您坚持提议的语法比的真正优势MERGE,就可以赢得我的投票。如果您过于倾向于“容易出错”的部分,那么我就不太可能接受。为什么?因为您可以用手指指任何语句。

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

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


2
谢谢亚伦。我浏览了MSDN上的T-SQL文档,但找不到我想要的东西。只是以为我会把它丢出去,以防万一我错过了什么。尽管MERGE语句在某些情况下是有意义的,但我不禁感到这是一个用于简单保存操作的“敲钉子的大锤”解决方案。也许我应该戴上程序员的帽子,穿上我的DBA Fedora。感谢您抽出宝贵的时间分享您的想法。
Pressacco 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.