2017-07-18 46 views
0
MERGE [TenantSync].[ReportingSync] AS MyTarget 
USING [TenantSync].[ReportingSyncStage] AS MySource 
ON MySource.[TenantID] = MyTarget.[TenantID] AND MySource.[ServiceID] = MyTarget.[ServiceID] 
WHEN MATCHED AND [MyTarget].[Modified] <> MySource.[Modified] 
    THEN UPDATE SET [FTOP_EntitlementCount] = MySource.FTOP_EntitlementCount, Modified = MySource.Modified 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT ([TenantID], [ServiceID], [FTOP_EntitlementCount], [Modified]) 
     VALUES (MySource.[TenantID], MySource.[ServiceID], MySource.[FTOP_EntitlementCount], MySource.[Modified]) 
WHEN NOT MATCHED BY SOURCE 
    THEN DELETE 

我意识到,我是从MYSOURCE更新所有行,即使MyTarget如果修改的日期没有改变,所以我说了“AND [MyTarget]。[修改] <> MYSOURCE 。[Modified]“给WHEN MATCHED期望它更新修改日期不匹配的记录。我将ReportingSync中的所有修改日期设置为null。运行合并声明,并且它可以快速处理,不会受到任何影响过滤器时,匹配工作不正常

想法?

+3

“NULL”不是一个值。试试这个([MyTarget]。[Modified] <> MySource。[Modified]或[MyTarget]。[Modified] IS NULL) – DVT

+2

另外,请小心使用'MERGE'](https://www.mssqltips。 COM/sqlservertip/3074 /使用 - 谨慎 - 与-SQL服务器合并语句/)。大部分这些问题都没有得到解决,尽管今年我们会看到自从添加MERGE以来的第六个主要版本。 –

+0

我习惯于处理空值,但我会期望比较两个字段以知道它们不匹配。我添加了OR [MyTarget]。[Modified] IS NULL,它立即填充Modified字段。我再次运行合并,并没有更新,这是非常好的。 – CubeRoot

回答

0

NULL <> 'some non-null value'不是“真”。

当使用ANSI NULLS(SQL Server的默认值)时,关于NULL唯一真实的事情是它IS NULL