Выполнение вставки или обновления (upsert) на сервере SQL Server Compact Edition

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

Вопрос

У меня есть проект C #, который использует sqlserver Compact Edition и Entity Framework для доступа к данным. У меня есть необходимость вставить или обновить большое количество строк, 5000+ или более в БД, поэтому, если ключ существует, обновите запись, если не вставьте ее. Я не могу найти способ сделать это с компактной версией и EF без ужасной производительности, то есть занимает 2 минуты плюс на компьютере с ядром i7. Я попытался найти запись, чтобы увидеть, существует ли она, затем вставить, если нет, или обновить, если это так, поиск является убийцей в этом. Я попытался составить поисковый запрос, и это дало лишь небольшое улучшение. Еще одна вещь, которую я пробовал, - вставка записи в попытку и попытка обновления, но это вынуждает меня сохранять изменения в каждой записи, чтобы получить исключение, а не в конце, что приводит к снижению производительности. Очевидно, я не могу использовать хранимые процедуры, так как это компактная версия. Также я рассмотрел просто выполнение t-sql напрямую на БД, но отсутствие операторов процесса в компакте, кажется, исключает это. Я искал по всему миру идеи. Я действительно хотел использовать компактный, если я могу чрезмерно выразить преимущества развертывания и возможность предотвратить копание пользователем базы данных. Любые предложения будут оценены.

Спасибо

Принятый ответ

Может быть, вы могли бы получить результат, который вы ищете, используя простые запросы. Допустим, таблица, в которую вы хотите вставить или обновить, выглядит следующим образом

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 в этом отношении), мы всегда сначала вызываем обновление, а затем вызываем вставку, если обновление дает количество строк, равное 0. Это очень просто реализовать и не требует затрат. .catch блоки для управления потоком.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow