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:合并语句的更新部分不起作用的主要内容,如果未能解决你的问题,请参考以下文章