Đây là điều khiến tôi khó chịu về MSSQL ( không bật blog của tôi
). Tôi ước 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:
--try an update
update tablename
set field1 = 'new value',
field2 = 'different value',
...
where idfield = 7
--insert if failed
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 :-(