SQLサーバーのテーブルにおいて、ほとんどの場合はレコードの追加であるが、ごくまれに更新があるかもしれないといった場合、いちいちレコードの存在チェックをしてから、レコードの追加または更新をするのは無駄である。これが1件ぐらいの処理であればいいが、数万件の処理ということになると、かなり無駄に感じる。
そこでストアドプロシージャを以下のようにしてみた。hoge1にはUNIQUE KEY制約を付けてある。
insert into table1 (hoge1, hoge2) values (@hoge1, @hoge2)
if @@ERROR = 0 GOTO skip
update table1 hoge2=@hoge2 where hoge1 = @hoge1
skip:
確かにこれで思った通りに動いている。しかし、C#からこのストアドプロシージャを呼ぶと、UNIQUE KEY制約違反の例外が発生する。しょうがないので、以下のようにして逃げた。
try
{
sqlCommand1.ExecuteNonQuery();
}
catch(System.Data.SqlClient.SqlException ex)
{
if (ex.Number != 2627) throw ex; //2627は、UNIQUE KEY制約違反
}
#何か指摘があれば、コメントをお願いします。(^^;