質問

データベース内の既存の行を更新するか、存在しない場合は挿入する必要がある従来の挿入/更新シナリオを実行しようとしています。

テーマに関する以前の質問を見つけました。しかし、私は使用していないストアドプロシージャを扱います。より良いものがない限り(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は(存在する場合)とにかく削除/挿入を行います

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top