【问题标题】:sync issues, certain columns do not get updated同步问题,某些列未更新
【发布时间】:2016-12-08 17:48:21
【问题描述】:

我保持下表同步。

从源到 DW,我这样做:

SELECT @UpdateDate = MAX(UpdateDate)
 FROM [ReplicatedVS3].[dbo].[Payment] 


 SELECT *  INTO #temp    
FROM [LinkedServer].[SF].[dbo].[Payment]
 WHERE UpdateDate >= @UpdateDate 


 DELETE FROM [ReplicatedVS3].[dbo].[Payment]          
 FROM [ReplicatedVS3].[dbo].[Payment] AS A     
 INNER JOIN #temp AS t        
     ON A.Payment_id  = t.Payment_id

INSERT INTO [ReplicatedVS3].[dbo].[Payment]  SELECT * FROM #temp

太棒了!我从来没有遇到过任何问题。

然后我这次在同一个 sql 实例中进行另一次传输:

SELECT @LastUpdateDate = MAX(UpdateDate)
FROM [BS].[dbo].[Salesforce_Payment]


insert  @PaymentsVS3
select  (columns…)
from    [ReplicatedVS3].[dbo].[Payment]
where   UpdateDate >= @LastUpdateDate


merge [BS].[dbo].[Salesforce_Payment] as TARGET
    using   (
            select  (columns…)
            from    @PaymentsVS3
            )
            as SOURCE
    on (TARGET.Payment_id = SOURCE.Payment_id) 

我发现了问题;计数总是完美的......但有些列没有得到更新,例如在 ReplicatedVS3 我看到 status = 'completed' 而在 BS 我看到一个不同的......所以这恰恰意味着合并的代码有问题......但是,当我手动运行它时:

insert  @PaymentsVS3
select  (columns…)
from    [ReplicatedVS3].[dbo].[Payment]
where   id = xxxx

它得到了正确的更新,所以合并工作很完美……现在唯一可能的原因是我没有捕捉到这一点的记录:

insert  @PaymentsVS3
select  (columns…)
from    [ReplicatedVS3].[dbo].[Payment]
where   UpdateDate >= @LastUpdateDate

我该如何解决这个问题,并确切知道为什么我看到列没有更新。

【问题讨论】:

    标签: sql-server tsql merge


    【解决方案1】:

    MERGE 不适用于列,它适用于行。当然,您只能更新触发UPDATE 的行的某些列,但合并语句的不同部分对数据行进行操作。快速检查一下,SOURCE 和/或TARGET 是否有重复的Payment_id

    您可以使用OUTPUT 子句调试MERGE 语句。这将允许您查看插入、更新和删除的行。这篇文章很好地概述了这种方法:Merge/Output

    【讨论】:

      猜你喜欢
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 2019-04-20
      相关资源
      最近更新 更多