在sql server compact edition上執行Insert OR Update(upsert)

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

我有c#項目正在使用sqlserver壓縮版和實體框架進行數據訪問。我需要向db插入或更新大量5000+或更多的行,因此如果密鑰存在,則更新記錄(如果不插入)。我無法找到一種方法來實現這一點與緊湊版和EF具有可怕的性能,即在核心i7計算機上花費2分鐘。我已經嘗試搜索記錄,看它是否存在,然後插入,如果沒有,或更新,如果它,搜索是殺手。我已經嘗試編譯搜索查詢,但只做了一點改進。我嘗試的另一件事是在try catch中插入記錄,如果更新失敗,但這迫使我在每條記錄上保存更改以獲得異常,而不是在最後是性能殺手。顯然我不能使用存儲過程,因為它是緊湊版。另外我看過只是在db上直接執行t-sql,但是在compact中缺少進程語句似乎排除了這一點。我在全世界範圍內搜尋和思考。我真的想使用緊湊型,如果我可以過度表達部署的好處和能力,以防止用戶挖掘數據庫。任何建議將不勝感激。

謝謝

一般承認的答案

也許你可以通過簡單的查詢獲得你尋求的結果。假設要插入或更新的表是這樣的

TABLE original
     id integer,
     value char(100)

首先,您可以使用新值創建臨時表(您可以使用SELECT INTO或其他方法來創建它)

TABLE temp
    id integer,
    value char(100)

現在,您需要做兩件事,更新原始行,然後插入新值

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)時,我們總是首先調用更新,然後在udate給出行數為0的情況下調用插入。這很容易實現,並且不需要進行代價嘗試。 .catch塊用於控制流程。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因