ぽにょろん

思いついたこととメモ

SQL ServerでMERGEを使ってINSERTとUPDATEを実行する

データベースへのデータ更新の際に、すでに該当行があればUPDATEし、なければINSERTするというシチュエーションはあると思います。

過去に参加したプロジェクトでは以下のような手法を見かけました。
・UPDATEを先にかけて、affectedな行が0ならINSERTする。
・INSERTを先にかけて、一意性違反が出たらUPDATEする。
・COUNTとってから分岐する。

ストアドだったり、プログラムから制御したり様々ですが、ちょっと嫌な感じですよね。

SQLServer2008以降では、MERGE文が使えるとのことです。 これを使えば、1文で上記処理が行えそうだとのことなので、試してみました。

検証環境

select @@version
-Microsoft SQL Server 2014 - 12.0.4100.1 (X64)

select serverproperty ('edition')
-Web Edition (64-bit)

検証内容

gistsに必要なものを上げたので、参照。
(全ファイル貼り付けしかできないのが辛い)

MERGEのテスト

MSDN複数記載があったので、両方書いてみました。

計算コストはどうなんでしょう。機会があれば調べてみたいと思いますが、
MERGEを使う方法も悪くないんじゃないかと思います。

※参考
MERGE (Transact-SQL)