SQL Server:合并语句的更新部分不起作用

Posted

技术标签:

【中文标题】SQL Server:合并语句的更新部分不起作用【英文标题】:SQL Server: Update portion of Merge Statement not working 【发布时间】:2013-05-13 19:08:12 【问题描述】:

我想我已经看这个声明太久了。谁能告诉我为什么这个声明的更新部分没有更新?我认为通过在列上使用or!= 进行测试,这应该只在需要时才引起更新的原因——相反,我似乎无意中创建了一个条件......永远不需要更新!

在查看声明之前,您需要了解以下 4 件事: 1. 临时表#Facilities 中的数据填充了来自多个来源的最新数据。此数据包含机器人新 (insert) 和更改 (update) 数据。 2. 在执行 Merge 语句之前,已验证#Facilities 的内容包含数据。 3. 合并语句的插入部分成功。 4.虽然语句的update部分没有更新改变的数据,但是语句并没有失败。

MERGE INTO PhoneMaster AS facilitymaster
 USING #Facilities as facilitynew
   ON facilitymaster.facilityid = facilitynew.facilityid
    AND facilitymaster.siteid = facilitynew.siteid
     WHEN MATCHED AND 
     (
       facilitymaster.User__bID != facilitynew.User__bID
    or facilitymaster.Email__baddress != facilitynew.Email__baddress
    or facilitymaster.Facility__bName != facilitynew.Facility__bName
    or facilitymaster.Division != facilitynew.Division
    or facilitymaster.District != facilitynew.District
      ) THEN
    UPDATE SET
     facilitymaster.User__bID = facilitynew.User__bID,
     facilitymaster.Email__baddress = facilitynew.Email__baddress,
     facilitymaster.Facility__bName = facilitynew.Facility__bName,
     facilitymaster.Division = facilitynew.Division,
     facilitymaster.District = facilitynew.District
     WHEN NOT MATCHED THEN
  INSERT
  ( User__bID,
    Email__baddress,
    Facility__bName,
    Division,
    District,
            FacilityId,
    SiteId

  )
  VALUES
  (
    facilitynew.User__bID,
    facilitynew.Email__baddress,
    facilitynew.Facility__bName,
    facilitynew.Division,
    facilitynew.District,
            facilitynew.FacilityId,
    facilitynew.SiteId

 );

【问题讨论】:

为什么需要 MERGE?你认为它能给你带来什么(除了更复杂和难以调试的语法)?似乎您可以使用UPDATE WHERE EXISTS / INSERT WHERE NOT EXISTS 模式更简单地实现这一点。 @Aaron,为什么不对这样的事情使用合并?我认为语法不一定更难。我认为应该有效的方法与为什么无效之间存在差距。关于为什么这个逻辑不起作用的任何想法? 我没有精力看逻辑,但这就是我不使用 MERGE 的原因(除了不可能记住的语法):sqlperformance.com/2013/02/t-sql-queries/another-merge-bug(请阅读全文发布)。 【参考方案1】:

我注意到的一件事是您的插入语句没有填充 FacilityID 或 SiteID。我提出的另一个建议是在匹配时注释掉您的“AND”子句,一次添加一行,直到它失败。我一直在使用 MERGE,它非常快速高效。

【讨论】:

感谢您支持合并! :) 对缺少属性的插入语句感到抱歉——它们在那里,这是一个不幸的剪切和粘贴工作——事实上,这个 MERGE 语句包含许多、更多的属性。我把它们删掉是为了消除噪音——专注于逻辑。 我会尝试您的流程,我知道(通过尝试)如果我消除 AND 子句并使用站点/设施键进行直接更新,一切都很好 - 尽管它会更新每个匹配的记录——不管它是否需要。对于少于 100k 行的表,这是我的替代方案。很高兴了解我的逻辑有什么问题,因为我无法将相同的解决方案应用于具有数百万行的表。这个逻辑缺陷可能非常愚蠢! :)

以上是关于SQL Server:合并语句的更新部分不起作用的主要内容,如果未能解决你的问题,请参考以下文章

sql-server 堆栈查询 sql 注入更新查询不起作用

SQL Server 2008 - 合并脚本不起作用

更新语句不起作用

SQL Update语句不起作用 - SQL Server

SQL Server,临时表,SELECT 语句不起作用

SQL Server 2008 - CAST 到 nvarchar 不起作用