Zakładając chcesz rzeczywiste 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 też chcesz usunąć rekordy w tarczy, które nie są 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 więcej Jestem popularny, mam wrażenie, że powinienem rozwinąć tę odpowiedź nieco z pewnymi zastrzeżeniami, o których należy pamiętać.
Po pierwsze, istnieje kilka blogów, które zgłaszają concurrency issues with the MERGE
statement. To może być w dużej mierze obejść podając wskazówkę HOLDLOCK
lub SERIALIZABLE
blokady:
MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
[...]
można również osiągnąć to samo z bardziej restrykcyjnych poziomów izolacji transakcji.
Istnieje several other known issues z MERGE
. Z tego co wiem, większość z nich nie jest częstym problemem lub może pracować z tymi samymi wskazówkami co powyżej, ale nie testowałem ich.
Jak to jest, chociaż nigdy nie miałem żadnych problemów z rachunku MERGE
siebie, ja zawsze używać wskazówkę WITH (HOLDLOCK)
teraz, a ja wolę używać oświadczenie tylko w najprostszym przypadków.
Czy w "temp_energydata" istnieją zapisy, których nie ma w "energydata"? –