Về cơ bản, bạn đang tìm kiếm một mẫu Chèn hoặc Cập nhật đôi khi được gọi là Nâng cấp.
Tôi đề xuất điều này:Chèn hoặc Cập nhật mẫu cho Máy chủ Sql - Sam Saffron
Đối với một thủ tục sẽ xử lý các hàng đơn lẻ, các giao dịch này sẽ hoạt động tốt:
Giải pháp đầu tiên của Sam Saffron (Điều chỉnh cho giản đồ này):
begin tran
if exists (
select *
from mytable with (updlock,serializable)
where col_a = @val_a
and col_b = @val_b
and col_c = @val_c
)
begin
update mytable
set col_d = @val_d
where col_a = @val_a
and col_b = @val_b
and col_c = @val_c;
end
else
begin
insert into mytable (col_a, col_b, col_c, col_d)
values (@val_a, @val_b, @val_c, @val_d);
end
commit tran
Giải pháp thứ hai của Sam Saffron (Điều chỉnh cho giản đồ này):
begin tran
update mytable with (serializable)
set col_d = @val_d
where col_a = @val_a
and col_b = @val_b
and col_c = @val_c;
if @@rowcount = 0
begin
insert into mytable (col_a, col_b, col_c, col_d)
values (@val_a, @val_b, @val_c, @val_d);
end
commit tran
Ngay cả khi sử dụng quảng cáo IGNORE_DUP_KEY
, bạn vẫn gặp khó khăn khi phải sử dụng khối chèn / cập nhật hoặc câu lệnh hợp nhất.
- Cách sử dụng IGNORE_DUP_KEY một cách sáng tạo - Paul White @Sql_Kiwi
update mytable
set col_d = 'val_d'
where col_a = 'val_a'
and col_b = 'val_b'
and col_c = 'val_c';
insert into mytable (col_a, col_b, col_c, col_d)
select 'val_a','val_b', 'val_c', 'val_d'
where not exists (select *
from mytable with (serializable)
where col_a = 'val_a'
and col_b = 'val_b'
and col_c = 'val_c'
);
Câu trả lời Hợp nhất do Spock cung cấp sẽ thực hiện những gì bạn muốn.
Hợp nhất không nhất thiết phải được khuyến khích. Tôi sử dụng nó, nhưng tôi không bao giờ thừa nhận điều đó với @AaronBertrand.
-
Thận trọng khi sử dụng câu lệnh MERGE của SQL Server - Aaron Bertrand
-
Tôi có thể tối ưu hóa câu lệnh hợp nhất này không - Aaron Bertrand
-
Nếu bạn đang sử dụng các chế độ xem được lập chỉ mục và MERGE, vui lòng đọc phần này! - Aaron Bertrand
-
Một lỗi MERGE thú vị - Paul White
-
Điều kiện Cuộc đua UPSERT Với Hợp nhất