【问题标题】:An action of type 'WHEN MATCHED' cannot appear more than once in a 'UPDATE' clause of a MERGE statement“WHEN MATCHED”类型的操作不能在 MERGE 语句的“UPDATE”子句中出现多次
【发布时间】:2022-07-06 11:06:35
【问题描述】:

当我尝试多次执行 WHEN MATCHED 操作类型时,我收到此错误。我已经阅读了一些关于为什么会发生这种情况的答案和文章,并且 MSDN 不允许 WHEN MATCHED 除非它使用语句删除或更新。

但是,我找不到问题的答案。有人可以指导我在这里做什么。

我有一个包含两个 WHEN MATCHED 和 Update 条件的合并语句,这就是我所需要的。关于如何更好地编写代码的任何想法?

MERGE [Digibill].[MertleUsedLinkys] AS [Target]
USING [Staging].[MertleUsedLinkys] AS [Source]
ON [Source].[LinkyCode] = [Target].[LinkyCode]
WHEN MATCHED  AND CONVERT(DATETIME, [Source].[LinkyPiTRunDateUTC]) > [Target].[LinkyPiTRunDateUTC]
THEN
 UPDATE SET [Target].[LinkyPiTRunDateUTC] = [LinkyPiTRunDateUTC],
            [Target].[LinkyQty] = [Source].[LinkyQty]


WHEN MATCHED AND CONVERT(DATETIME, [Source].[LinkyPiTRunDateUTC]) <= [Target].[LinkyPiTRunDateUTC]
THEN 
UPDATE SET 
            [Target].[LinkyCode] = [Source].[LinkyCode],
            [Target].[ServiceKey] = [Source].[ServiceKey],
            [Target].[CustName] = [Source].[CustName],
            [Target].[SupplyRegion] = [Source].[SupplyRegion],
            [Target].[ServiceStatus] = [Source].[ServiceStatus],
            [Target].[NS_ExtID] = [Source].[NS_ExtID],
            [Target].[PartitionKey] = [Source].[PartitionKey],
            [Target].[BillingMthly_PIT] = [Source].[BillingMthly_PIT],
            [Target].[CurrentBillingPeriod] = [Source].[CurrentBillingPeriod],
            [Target].[LinkyPiTRunDateUTC] = [Source].[LinkyPiTRunDateUTC],
            [Target].[CurrBillingPeriodStatus] = [Source].[CurrBillingPeriodStatus],
            [Target].[LinkyQty] = [Source].[LinkyQty]


         
WHEN NOT MATCHED THEN
        INSERT (    
        [LinkyCode] ,
    [ServiceKey] ,
    [CustName],
    [SupplyRegion],
    [ServiceStatus],
    [NS_ExtID],
    [PartitionKey],
    [BillingMthly_PIT],
    [CurrentBillingPeriod],
    [LinkyPiTRunDateUTC],
    [CurrBillingPeriodStatus],
    [LinkyQty]
)

 VALUES 
 ([Source].[LinkyCode], [Source].[ServiceKey], [Source].[CustName], [Source].[SupplyRegion], [Source].[ServiceStatus], [Source].[NS_ExtID], [Source].[PartitionKey],
    [Source].[BillingMthly_PIT], [Source].[CurrentBillingPeriod],CONVERT(DATETIME,[Source].[LinkyPiTRunDateUTC]),[Source].[CurrBillingPeriodStatus],[Source].[LinkyQty]
)

END;

显然,当我运行代码时,我得到了错误。感谢任何想法、线索或解决方法。

【问题讨论】:

  • 谢谢你。我会去的

标签: sql sql-server


【解决方案1】:

根据您当前作为“匹配”分支的一部分在更新中使用CASE 表达式。即对于只在一个分支中更新的那些,使用 case 表达式来更新它,或者保持不变。这是您的专栏之一的示例。

[Target].[LinkyCode] =
    CASE
    WHEN CONVERT(DATETIME, [Source].[LinkyPiTRunDateUTC]) <= [Target].[LinkyPiTRunDateUTC] THEN [Source].[LinkyCode]
    ELSE [TARGET].[LinkyCode]
    END

【讨论】:

    猜你喜欢
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 2016-05-10
    • 2020-04-12
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多