これはMSSQL(rant on my blog)について私を悩ますものです。私はMSSQLがupsert
をサポートすることを願っています。 Dillie-Oのコード@
が古いSQLのバージョン(1票)で良い方法ですが、それはまだ基本的に2つのIO操作(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', ...)
これは、1つのIO操作にそれを減らす場合、または2のインサート。
MS SQL2008は、SQLからmerge
を紹介: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, ...)
は、今では本当にただ1つのIO操作だが、ひどいコード
すばらしい、ありがとう!選択を保存し、しばしば更新と "私"の挿入の間にそのキーのための他の挿入がないことを確かめることができる状況では、teransactionは必要ありません。 –
@Michaelこのソリューションを使用する場合は、このテーブルにユニークなインデックスを持ち、重複したキーエラーを処理する方がよいでしょう。 –
@Keithマージステートメントが機能しません。 'MERGE'は' WHERE'節をサポートしていないので、 'USING'と' ON'を使って書き直す必要があります。また、 'WITH(HOLDLOCK)'を追加しない限り、レースがあり、同時にINSERTが発生する可能性があります。キー衝突のためにそれらのいずれかが失敗する可能性があります。 –