UPSERTの概念に似たT-SQLコマンドに出会ったことがありますか?オプション(1)または(2)を使用してINSERT | UPDATE操作を実行すると、過度に複雑でエラーが発生しやすくなります。
目的
目的のレコード(この場合、employee_id 1)が最新であり、本質的に同じクエリを2回記述する必要がないことを確認します。
環境
- テーブル名:従業員
- 従業員ID:主キーがあり、IDプロパティがtrueに設定されています
オプション
SQL UPDATEを実行... @@ rowcount = 0および@@ error = 0をチェック...必要に応じてSQL INSERTを実行
- con:同じクエリを、挿入として1回、更新として1回、事実上2回記述する必要があります
- con:より多くのコード=より多くの時間入力
- con:より多くのコード=より多くのエラーの余地
/programming/1106717/how-to-implement-a-conditional-upsert-stored-procedure「@@ rowcountを使用して更新」
- SQL MERGEを実行します
- con:同じクエリを、挿入として1回、更新として1回、事実上2回記述する必要があります
- con:より多くのコード=より多くの時間入力
- con:より多くのコード=より多くのエラーの余地
http://technet.microsoft.com/en-us/library/bb510625.aspx「T-SQLマージ」
- SQL UPSERTを実行します(機能は存在しません)
- pro:データとテーブルの関係を一度定義します(SQL ServerがINSERTかUPDATEかどうかを心配させます)
- pro:コードの削減=実装の高速化
- pro:少ないコード=低い確率
UPSERTの例
UPSERT employeee(employee_id、employee_number、job_title、first_name、middle_name、surname、modified_at)VALUES(1、'00 -124AB37 '、' Manager '、' John '、' T '、' Smith '、GetDate());
- employee_id 1が存在しない場合:MS SQLはINSERTステートメントを実行します
- employee_id 1が存在する場合:MS SQLが実行され、UPDATEステートメント
MERGE
は、簡単で柔軟性があり、SQL Standardの一部でもあります。MERGE
その他のUPSERT
実装の実際の問題は、潜在的なロックエスカレーション、または構文とは関係のないデッドロックです。
MERGE
にSQL Serverでの実装に関する論争です。