MERGE
đã được giới thiệu trong SQL Server 2008. Nếu bạn muốn sử dụng cú pháp đó, bạn cần phải nâng cấp.
Nếu không, cách tiếp cận điển hình sẽ phụ thuộc vào nguồn dữ liệu từ đâu. Nếu đó chỉ là một hàng và bạn không biết mình cần cập nhật hay chèn thêm, bạn có thể làm:
UPDATE ... WHERE key = @key;
IF @@ROWCOUNT = 0
BEGIN
INSERT ...
END
Nếu nguồn của bạn là bảng #temp, biến bảng, TVP hoặc bảng khác, bạn có thể thực hiện:
UPDATE dest SET ...
FROM dbo.destination AS dest
INNER JOIN dbo.source AS src
ON dest.key = src.key;
INSERT dbo.destination SELECT ... FROM dbo.source AS src
WHERE NOT EXISTS (SELECT 1 FROM dbo.destination WHERE key = src.key);
Như với MERGE
(và như Michael Swart đã trình bày ở đây
), bạn sẽ vẫn muốn bao quanh bất kỳ phương pháp nào trong số này với các giao dịch thích hợp, xử lý lỗi và mức độ cô lập để hoạt động như một hoạt động thực sự, đơn lẻ. Ngay cả một MERGE
tuyên bố không bảo vệ bạn khỏi sự đồng thời.
Tôi đã xuất bản một số các cảnh báo khác về MERGE trong chi tiết hơn tại đây .