Это меня раздражает MSSQL (rant on my blog). Я хочу, чтобы MSSQL поддерживал upsert
.
@ код Dillie-O является хорошим способом в старых SQL версий (+1 голосов), но она по-прежнему в основном две операции ввода-вывода (exists
, а затем update
или insert
)
Там в немного лучший способ на this post, в основном:
--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', ...)
Это уменьшает его на одной операции ввода-вывода, если это обновление, или два, если вставка.
MS SQL2008 вводит merge
из 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, ...)
Теперь это действительно только одна операция ввода-вывода, но ужасный код :-(
Отлично, спасибо! Сохраняет выбор и часто даже не нуждается в трансакции в ситуациях, когда я могу быть уверен, что между обновлением и «моей» вставкой нет другой вставки для этого ключа. – 2008-09-20 15:41:27