Dengan asumsi Anda menginginkan SQL Server MERGE
yang sebenarnya
pernyataan:
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);
Jika Anda juga ingin menghapus record di target yang tidak ada di sumber:
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;
Karena ini telah menjadi sedikit lebih populer, saya merasa saya harus sedikit memperluas jawaban ini dengan beberapa peringatan yang harus diperhatikan.
Pertama, ada beberapa blog yang melaporkan masalah konkurensi dengan MERGE
pernyataan
di versi SQL Server yang lebih lama. Saya tidak tahu apakah masalah ini pernah dibahas dalam edisi-edisi selanjutnya. Either way, ini sebagian besar dapat diselesaikan dengan menentukan HOLDLOCK
atau SERIALIZABLE
petunjuk kunci:
MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
[...]
Anda juga dapat melakukan hal yang sama dengan tingkat isolasi transaksi yang lebih ketat.
Ada beberapa masalah lain yang diketahui dengan MERGE
. (Perhatikan bahwa karena Microsoft nuked Connect dan tidak menghubungkan masalah di sistem lama ke masalah di sistem baru, masalah lama ini sulit dilacak. Terima kasih, Microsoft!) Dari apa yang saya tahu, kebanyakan dari mereka tidak umum masalah atau dapat diatasi dengan petunjuk penguncian yang sama seperti di atas, tetapi saya belum mengujinya.
Seperti itu, meskipun saya tidak pernah memiliki masalah dengan MERGE
pernyataan sendiri, saya selalu menggunakan WITH (HOLDLOCK)
petunjuk sekarang, dan saya lebih suka menggunakan pernyataan itu hanya dalam kasus yang paling sederhana.