2017-07-18 19 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