Zakładając, że potrzebujesz rzeczywistego SQL Server MERGE
oświadczenie:
MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
USING dbo.temp_energydata AS source
ON target.webmeterID = source.webmeterID
AND target.DateTime = source.DateTime
WHEN MATCHED THEN
UPDATE SET target.kWh = source.kWh
WHEN NOT MATCHED BY TARGET THEN
INSERT (webmeterID, DateTime, kWh)
VALUES (source.webmeterID, source.DateTime, source.kWh);
Jeśli chcesz również usunąć rekordy w miejscu docelowym, których nie ma w źródle:
MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
USING dbo.temp_energydata AS source
ON target.webmeterID = source.webmeterID
AND target.DateTime = source.DateTime
WHEN MATCHED THEN
UPDATE SET target.kWh = source.kWh
WHEN NOT MATCHED BY TARGET THEN
INSERT (webmeterID, DateTime, kWh)
VALUES (source.webmeterID, source.DateTime, source.kWh)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
Ponieważ stało się to nieco bardziej popularne, uważam, że powinienem nieco rozszerzyć tę odpowiedź o pewne zastrzeżenia, o których należy pamiętać.
Po pierwsze, istnieje kilka blogów, które zgłaszają problemy ze współbieżnością z MERGE
oświadczenie
w starszych wersjach SQL Server. Nie wiem, czy ten problem został kiedykolwiek poruszony w późniejszych wydaniach. Tak czy inaczej, można to w dużej mierze obejść, określając HOLDLOCK
lub SERIALIZABLE
wskazówka blokady:
MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
[...]
Możesz również osiągnąć to samo z bardziej restrykcyjnymi poziomami izolacji transakcji.
Istnieje kilka innych znanych problemów z MERGE
. (Zauważ, że odkąd Microsoft wyrzucił Connect i nie połączył problemów w starym systemie z problemami w nowym systemie, te starsze problemy są trudne do wyśledzenia. Dzięki, Microsoft!) Z tego, co mogę powiedzieć, większość z nich nie jest powszechna problemy lub można je obejść za pomocą tych samych wskazówek dotyczących blokowania, jak powyżej, ale ich nie testowałem.
Tak jak jest, mimo że nigdy nie miałem żadnych problemów z MERGE
oświadczenie, zawsze używam WITH (HOLDLOCK)
podpowiedź teraz i wolę używać tego stwierdzenia tylko w najprostszych przypadkach.