単一データをキーによって Update または Insert で実行するかを判断する SQL

動作環境

SQL Server
  • SQL Server 2005
  • SQL Server 2008
  • SQL Server 2008 R2

動作確認環境

SQL Server SQL Server 2008 R2

内容

キーがある場合は Update, ない場合は Insert というような処理は、通常、キーをもとに Select を実行し、1件あるかどうかを確認して処理を判断します。また、SQL Server 2008 からは「merge」ステートメントが追加され、1つのステートメントで Update と Insert (あと Delete) を実行することができます。ただしこちらは2つのテーブルを比較しての実行となり、単一データには向きません。

実は Select 文で件数を調べなくても簡単に Update と Insert を判定して行を更新できる方法があります。

update [TableName]
set [ColumnName] = @value
--    : 他更新 SQL
where [KeyColumnName] = @value
--    : 他キー比較
if @@ROWCOUNT = 0
insert into [TableName]
(
  [ColumnName]
--  : 他更新 SQL
)
values
(
  @value
--  : 他更新値
)

ここでキーワードになるのが「@@ROWCOUNT」です。@@ROWCOUNTは直前の SQL が適用された行数をを取得できます。上記のコードでは最初に Update ステートメントを実行し、更新されていれば、@@ROWCOUNT は 1以上を返すので次の Insert ステートメントを実行しません。逆に Update ステートメントで1行も更新されないと @@ROWCOUNT は 0 を返すので IF 文判定で Insert を実行します。

上記の SQL はテンプレートなので適時列名や更新する値などは置き換えてください。@value はただの変数名なのでこれも更新する値に置き換えてください。