実際の 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
で問題が発生したことはありませんが、そのままです。 私自身、私は常にWITH (HOLDLOCK)
を使用しています 私は、最も単純なケースでのみステートメントを使用することを好みます.