2

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

件名に関する以前の質問を見つけましたが、それは私が使用していないストアド プロシージャを扱っています。もっと良い方法がない限り、単純な SQL SELECT、INSERT、および UPDATE ステートメントを使用したいと思います (MERGE ステートメントは SQL Server 2005 では使用できません)。

私の一般的な考えはこれだと思います:

If the row is found
  update
else
  insert

行の存在をチェックすることに関して、UPDATE または INSERT を呼び出す前に SELECT ステートメントを実行するのはどれくらいコストがかかりますか? それとも、UPDATE を試して、影響を受ける行の数を確認し、影響を受ける行が 0 の場合は INSERT を実行する方がよいでしょうか?

4

4 に答える 4

8

最も効率的な方法は、この前の回答で説明されているように、 を実行してからif is zeroUPDATEを実行することです。INSERT@@rowcount

于 2008-11-04T10:33:20.833 に答える
0

あなたの投稿のタイトルが「SQL Server 2005」であったことを完全に理解していますが、SQL 2008 にアップグレードする場合、またはそのときに期待できる何かを捨てたかっただけです。Microsoft は、1 つの DML ステートメントをコーディングできるようにする新しい MERGE ステートメントを追加しました。更新と挿入の両方を行います。超カッコイイ。パフォーマンスと I/O を比較したことはまだありませんが、ツールボックスに別のツールがあるのは素晴らしいことです。

于 2008-11-04T12:38:44.093 に答える
0

(まず第一に、強い理由がない限り、ストアドプロシージャを避けようとはしません。ほとんどの場合、ストアドプロシージャは良い利益をもたらします。)

あなたはこのようにすることができます:

  • (一時) テーブルを作成する
  • 行を埋める
  • 既存の行を識別する INTERSECT を実行する
  • それらでテーブルを更新します
  • 新しい行を識別する EXCEPT を実行します
  • これらの要素で挿入を実行します
  • (一時的な)テーブルをドロップ/クリアする

大量の行を挿入/更新している場合、これはおそらくより高速に実行されます。

于 2008-11-04T12:19:52.040 に答える
-1

常に行おうとしている場合:
* 行を数えます
* 結果に基づいて挿入 / 更新します

代わりに:
* 行を削除
* 行を挿入

同じ結果でよりきれいです。
行を更新するときに私が知る限り-SQLServerはとにかく削除/挿入を行います(存在する場合)

于 2008-11-04T12:28:26.030 に答える