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.
Có 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.