Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Câu lệnh SQL MERGE để cập nhật dữ liệu

Giả sử bạn muốn có một Máy chủ SQL thực sự MERGE tuyên bố:

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);

Nếu bạn cũng muốn xóa các bản ghi trong đích không có trong nguồn:

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;

Bởi vì điều này đã trở nên phổ biến hơn một chút, tôi cảm thấy mình nên mở rộng câu trả lời này một chút với một số lưu ý cần lưu ý.

Đầu tiên, có một số blog báo cáo sự cố đồng thời với MERGE tuyên bố trong các phiên bản SQL Server cũ hơn. Tôi không biết liệu vấn đề này đã bao giờ được giải quyết trong các phiên bản sau này hay chưa. Dù bằng cách nào, điều này phần lớn có thể được giải quyết bằng cách chỉ định HOLDLOCK hoặc SERIALIZABLE gợi ý khóa:

MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
[...]

Bạn cũng có thể thực hiện điều tương tự với các mức cô lập giao dịch hạn chế hơn.

một số sự cố đã biết khác với MERGE . (Xin lưu ý rằng vì Microsoft không hạt nhân hóa Connect và không liên kết các vấn đề trong hệ thống cũ với các vấn đề trong hệ thống mới, những vấn đề cũ hơn này rất khó theo dõi. Cảm ơn Microsoft!) Từ những gì tôi có thể nói, hầu hết chúng không phổ biến các vấn đề hoặc có thể được khắc phục với các gợi ý khóa tương tự như trên, nhưng tôi chưa thử nghiệm chúng.

Như hiện tại, mặc dù tôi chưa bao giờ gặp bất kỳ sự cố nào với MERGE bản thân tuyên bố, tôi luôn sử dụng WITH (HOLDLOCK) gợi ý ngay bây giờ và tôi chỉ thích sử dụng câu lệnh trong các trường hợp đơn giản nhất.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thêm một cột được tính toán vào một bảng hiện có trong SQL Server

  2. Chỉ mục văn bản đầy đủ của SQL Server

  3. Cách gọi dịch vụ web từ thủ tục được lưu trữ trên SQL Server

  4. Cách bật tất cả các ràng buộc kiểm tra trong cơ sở dữ liệu SQL Server - Hướng dẫn SQL Server / TSQL Phần 88

  5. Cách tách một chuỗi trong SQL Server