У меня есть.Net DataTable, который содержит записи, все из которых являются "добавленными" записями. Соответствующая таблица в базе данных может содержать миллионы строк. Если я попытаюсь просто вызвать метод "Обновить" в моем SqlDataAdapter, любые существующие записи приведут к тому, что исключение будет вызвано из-за нарушения ограничения первичного ключа. Я рассмотрел загрузку всех записей физических таблиц во второй экземпляр DataTable, слияние двух, а затем вызов метода Update во втором DataTable. Это действительно работает так, как я хочу. Однако я обеспокоен тем, что если в физической таблице будет 30 миллиардов записей, загрузка этой информации в DataTable в памяти может быть проблемой.
Я решил выбрать подмножество данных из физической таблицы и продолжить, как описано выше, но построение подзапроса оказалось очень сложным и очень утомительным. Понимаете, я не работаю с одной известной таблицей. Я работаю с DataSet, который содержит несколько сотен DataTables. Каждая из таблиц DataTables соответствует своей собственной физической таблице. Имя и схема таблиц не известны во время компиляции. Это нужно сделать во время выполнения.
Я играл с классом SqlBulkCopy, но имел ту же проблему - дубликаты записей создают исключение.
Я не хочу динамически строить запросы для каждой таблицы во время выполнения. Если это единственный способ, пусть будет так, но я просто не могу не думать о том, что должно быть более простое решение, используемое Ado.Net.
вы можете создать свою команду insert так:
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 (временная таблица, используемая для этого примера) создается таким образом (с первичным ключом на id)
create table #temp (id int not null, txt nvarchar(100))