Как я могу обновить таблицу базы данных с помощью .Net DataTable и игнорировать существующие записи?

У меня есть .Net DataTable, который содержит записи, все из которых являются "добавленными" записями. Соответствующая таблица в базе данных может содержать миллионы строк. Если я попытаюсь просто вызвать метод «Обновить» в моем SqlDataAdapter, любые существующие записи вызовут исключение из-за нарушения ограничения первичного ключа. Я решил загрузить все записи физической таблицы во второй экземпляр DataTable, объединить их и затем вызвать метод Update для второго экземпляра DataTable. Это на самом деле работает именно так, как я хочу. Однако меня беспокоит то, что если в физической таблице 30 миллиардов записей, загрузка всех этих данных в DataTable в памяти может стать проблемой.

Я решил выбрать подмножество данных из физической таблицы и продолжить, как описано выше, но построение подзапроса оказалось очень сложным и утомительным. Видите ли, я не работаю с одной известной таблицей. Я работаю с набором данных, который содержит несколько сотен таблиц данных. Каждая из таблиц данных сопоставляется со своей собственной физической таблицей. Имя и схема таблиц неизвестны во время компиляции. Все это нужно делать во время выполнения.

Я играл с классом SqlBulkCopy, но у меня та же проблема - повторяющиеся записи вызывают исключение.

Я не хочу динамически создавать запросы для каждой таблицы во время выполнения. Если это единственный способ, пусть будет так, но я просто не могу не думать, что должно быть более простое решение, использующее то, что предоставляет Ado.Net.


person Cory Miller    schedule 09.12.2014    source источник


Ответы (1)


вы можете создать свою команду вставки следующим образом:

declare @pk int = 1
declare @txt nvarchar(100) = 'nothing'
insert into #temp (id, txt)
    select distinct @pk, @txt 
        where not exists (select id from #temp x where x.id = @pk)

предполагая, что ваша таблица #temp (временная таблица, используемая в этом примере) создана следующим образом (с первичным ключом в идентификаторе)

create table #temp (id int not null, txt nvarchar(100))
person PrfctByDsgn    schedule 10.12.2014