基本的に挿入または更新パターンを探しています アップサートと呼ばれることもあります
これをお勧めします:SQLServerのパターンの挿入または更新-Sam Saffron
単一行を処理するプロシージャの場合、これらのトランザクションのいずれかが適切に機能します。
Sam Saffronの最初のソリューション(このスキーマに適合):
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
Sam Saffronの2番目のソリューション(このスキーマに適合):
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
IGNORE_DUP_KEY
をクリエイティブに使用しても 、挿入/更新ブロックまたはマージステートメントを使用する必要があります。
- IGNORE_DUP_KEYのクリエイティブな使用-PaulWhite@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'
);
Spockが提供するMergeの回答は、あなたが望むことをするはずです。
マージ 必ずしも推奨されるわけではありません。私はそれを使用していますが、@AaronBertrandにそれを認めることは決してありません。
-
SQLServerのMERGEステートメントに注意してください-AaronBertrand
-
このマージステートメントを最適化できますか-AaronBertrand
-
インデックス付きビューとMERGEを使用している場合は、こちらをお読みください。 -アーロンベルトラン
-
興味深いMERGEバグ-PaulWhite
-
マージによるUPSERTの競合状態