Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Pernyataan SQL MERGE untuk memperbarui data

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masalah dengan kinerja parameter nilai tabel

  2. Panduan Mudah tentang Cara Menggunakan Subqueries di SQL Server

  3. Cara mengambil gambar biner dari database menggunakan C# di ASP.NET

  4. Menulis CTE Rekursif menggunakan sintaks Entity Framework Fluent atau sintaks Inline

  5. Pendekatan terbaik untuk menghapus bagian waktu dari datetime di SQL Server