ストアドプロシージャを使用しないSQL Server 2005での挿入/更新
-
06-07-2019 - |
質問
データベース内の既存の行を更新するか、存在しない場合は挿入する必要がある従来の挿入/更新シナリオを実行しようとしています。
テーマに関する以前の質問を見つけました。しかし、私は使用していないストアドプロシージャを扱います。より良いものがない限り(SQL Server 2005ではMERGEステートメントは使用できません)、単純なSQL SELECT、INSERT、およびUPDATEステートメントを使用したいだけです。
私の一般的なアイデアはこれだと思います:
If the row is found
update
else
insert
行の存在をチェックする場合、UPDATEまたはINSERTを呼び出す前にSELECTステートメントを実行するのはどれくらいの費用がかかりますか?または、UPDATEを試して、影響を受けた行の数を確認し、影響を受けた行が0の場合にINSERTを実行する方が良いでしょうか?
解決
最も効率的な方法は、 UPDATE
を実行し、 @@ rowcount
がゼロの場合に INSERT
を実行することです。この以前の回答で説明したとおり。
他のヒント
(まず第一に、強い理由がない限り、ストアドプロシージャを避けようとはしません。ほとんどの場合、良い利益をもたらします。)
次のようにできます:
- (一時的な)テーブルを作成する
- 行を埋める
- 既存の行を識別するINTERSECTを実行します
- それらでテーブルを更新する
- 新しい行を識別するEXCEPTを実行します
- これらの要素を使用して挿入を実行
- (一時的な)テーブルをドロップ/クリアする
大量の行を挿入/更新する場合、これはおそらくより高速に実行されます。
投稿のタイトルが「SQL Server 2005」であることを完全に理解してください。ただし、SQL 2008にアップグレードする場合、またはアップグレードするときに楽しみになるものを捨てたいだけです。Microsoftは、更新と挿入の両方を行う1つのDMLステートメントをコーディングできる新しいMERGEステートメントを追加しました。すごいかっこいい。パフォーマンスとI / Oをまだ比較していませんが、ツールボックスに別のツールがあると便利です。
いつも行く場合:
*行を数える
*結果に基づいて挿入/更新
代わりに:
*行を削除
*行の挿入
同じ結果でよりきれい。
私が知る限り、行を更新するとき-SQLServerは(存在する場合)とにかく削除/挿入を行います