Đây là điều gì đó làm tôi khó chịu về MSSQL ( rant trên blog của tôi ). Tôi muốn MSSQL được hỗ trợ upsert
.
Mã của @ Dillie-O là một cách hay trong các phiên bản SQL cũ hơn (+1 phiếu bầu), nhưng về cơ bản nó vẫn là hai hoạt động IO ( exists
và sau đó là update
hoặc insert
)
Có một cách tốt hơn một chút về bài đăng này , về cơ bản:
update tablename
set field1 = 'new value',
field2 = 'different value',
...
where idfield = 7
if @@rowcount = 0 and @@error = 0
insert into tablename
( idfield, field1, field2, ... )
values ( 7, 'value one', 'another value', ... )
Điều này làm giảm nó thành một hoạt động IO nếu đó là một bản cập nhật hoặc hai nếu một phần chèn.
MS Sql2008 giới thiệu merge
từ tiêu chuẩn SQL: 2003:
merge tablename as target
using (values ('new value', 'different value'))
as source (field1, field2)
on target.idfield = 7
when matched then
update
set field1 = source.field1,
field2 = source.field2,
...
when not matched then
insert ( idfield, field1, field2, ... )
values ( 7, source.field1, source.field2, ... )
Bây giờ nó thực sự chỉ là một hoạt động IO, nhưng mã khủng khiếp :-(