SQL Server Compact Editionで挿入または更新(upsert)を実行する

c# entity-framework sql sql-server-ce upsert

質問

私はsqlserverのコンパクト版とデータアクセスのためのエンティティフレームワークを使用しているC#のプロジェクトを持っています。私はデータベースに5000以上の大量の行を挿入または更新する必要があるので、キーが存在する場合は挿入しない場合はレコードを更新します。私は恐ろしいパフォーマンス、すなわちコアi7コンピューターで2分以上かかるというコンパクト版とEFでこれを行う方法を見つけることができません。レコードが存在するかどうかを調べて、存在しない場合は挿入、存在する場合は更新してみました。検索はそれを妨げるものです。私は検索クエリをコンパイルしようとしましたが、それはほんの少しの改善をもたらしました。試してみたもう1つの方法は、try catchにレコードを挿入して更新に失敗した場合ですが、パフォーマンスを低下させるのではなく、例外を取得するためにすべてのレコードで変更を保存する必要があります。それはコンパクト版なので明らかに私はストアドプロシージャを使用することはできません。また、db上で直接t-sqlを直接実行する方法も検討しましたが、コンパクトなプロセスステートメントがないため、これを排除できます。私は世界中のアイデアを検索しました。展開の利点と、ユーザーがデータベースを調べなくて済むようにする能力を過剰に表現できる場合は、本当にcompactを使用したいと思いました。任意の提案は大歓迎です。

ありがとう

受け入れられた回答

たぶん、あなたはあなたが求める結果を簡単な質問を使うことによって得ることができた。挿入または更新したいテーブルがこのようなものであるとしましょう。

TABLE original
     id integer,
     value char(100)

最初に新しい値を使って一時テーブルを作成することができます(それを作成するにはSELECT INTOまたは他の方法を使用できます)

TABLE temp
    id integer,
    value char(100)

今、あなたは2つのことをする必要があります、オリジナルの行を更新してから新しい値を挿入する

UPDATE original 
SET original.value = temp.value
FROM original, temp
WHERE original.id = temp.id

INSERT INTO original 
SELECT * from temp 
WHERE temp.id not IN (select o.id from original o)

人気のある回答

SQL CE(そしてそれに関してはSQL 2005 Express)を使用しているときは、常に最初にupdateを呼び出し、udateが0の行数を与える場合には次にinsertを呼び出します。制御フローのための.catchブロック



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ