Предположим, вам нужен фактический оператор SQL Server MERGE
:
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);
Если вы также хотите удалить записи в цели, которых нет в источнике:
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;
Поскольку это стало немного более популярным, я чувствую, что должен немного расширить этот ответ с некоторыми оговорками, о которых следует знать.
Во-первых, есть несколько блогов, в которых сообщается проблемы параллелизма с оператором MERGE
в старых версиях SQL Server. Я не знаю, поднимался ли этот вопрос когда-либо в более поздних изданиях. В любом случае, это можно обойти, указав подсказку блокировки HOLDLOCK
или SERIALIZABLE
:
MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
[...]
Вы также можете сделать то же самое с более строгими уровнями изоляции транзакций.
Существует несколько других известных проблем. с MERGE
. (Обратите внимание, что, поскольку Microsoft отключила Connect и не связывала проблемы в старой системе с проблемами в новой системе, эти старые проблемы трудно отследить. Спасибо, Microsoft!) Насколько я могу судить, большинство из них не распространены. проблемы, или их можно обойти с помощью тех же подсказок блокировки, что и выше, но я их не проверял.
Как бы то ни было, хотя у меня никогда не было проблем с оператором MERGE
, теперь я всегда использую подсказку WITH (HOLDLOCK)
и предпочитаю использовать оператор только в самых простых случаях.
person
Bacon Bits
schedule
11.02.2013
temp_energydata
записи, которых нет вenergydata
? - person Nick.McDermaid   schedule 11.02.2013