単一データをキーによって Update または Insert で実行するかを判断する SQL
ページ更新日 :
ページ作成日 :
キーがある場合は 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 はただの変数名なのでこれも更新する値に置き換えてください。