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

Ich erkannte, dass ich alle Zeilen aus MySource wurde die Aktualisierung auch auf mytarget wenn das Änderungsdatum nicht geändert hatte, so habe ich die „AND [MyTarget]. [Geändert] <> MySource . [Modified] "an den WANN ANPASSEN erwartet, dass die Datensätze aktualisiert werden, deren Änderungsdatum nicht übereinstimmt. Ich habe alle geänderten Daten in ReportingSync auf null festgelegt. Lief die Merge-Anweisung und es verarbeitet schnell ohne betroffene Datensätze.Filter, wenn Matched funktioniert nicht wie erwartet

Ideen?

+3

'' NULL'' ist kein Wert. Versuchen Sie dies ([MyTarget]. [Geändert] <> MySource. [Geändert] ODER [MyTarget]. [Geändert] IS NULL) – DVT

+2

Auch, bitte [sei sehr vorsichtig mit 'MERGE'] (https: //www.mssqltips. com/sqlservertip/3074/verwenden-caution-with-sql-servers-merge-statement /). Die meisten dieser Probleme wurden nicht angesprochen, obwohl wir in diesem Jahr die sechste größere Veröffentlichung seit "MERGE" sehen werden. –

+0

Ich bin es gewohnt, mit Nullwerten umzugehen, aber ich hätte erwartet, dass zwei Felder verglichen werden, um zu wissen, dass sie nicht übereinstimmen. Ich fügte das OR [MyTarget] hinzu. [Modified] IS NULL und es füllte sofort die geänderten Felder aus. Ich habe die Zusammenführung erneut ausgeführt und es wurden keine Aktualisierungen durchgeführt, was ausgezeichnet ist. – CubeRoot

Antwort

0

Es ist nicht "wahr", dass NULL <> 'some non-null value'.

Wenn Sie ANSI NULL verwenden (was für SQL Server standardmäßig ist), ist das einzige, was jemals über NULL wahr ist, dass es IS NULL ist.

Verwandte Themen