Мне нужно проанализировать большой XML файл и импортировать (вставлять/обновлять) его данные в различные таблицы с ограничениями внешнего ключа.
Поэтому я впервые подумал: я создаю список операторов вставки/обновления SQL и выполняю их все сразу, используя SqlCommand.ExecuteNonQuery()
.
Другой метод, который я нашел, был показан AMissico: Method, где я буду выполнять команды sql один за другим. Никто не жаловался, поэтому я считаю его жизнеспособной практикой.
Затем я узнал о SqlBulkCopy
, но мне кажется, что мне нужно будет создать DataTable с данными, которые я хочу загрузить. Итак, SqlBulkCopy
для каждой таблицы. Для этого я мог бы создать DataSet.
Я думаю, что каждый вариант поддерживает SqlTransaction
. Это примерно 100-20000 записей за стол.
Какой вариант вы бы предпочли и почему?
Вы говорите, что XML уже находится в базе данных. Сначала решите, хотите ли вы обработать его на С# или в T-SQL.
В зависимости от вашего дела, он может быть намного быстрее, чем другой (непонятно, какой из них).
Если вы хотите вычислить на С#, используйте один потоковый SELECT
для чтения данных и одного SqlBulkCopy для его записи. Если ваши записи не являются вставками, пишите в временную таблицу и выполняйте как можно меньше инструкций DML, чтобы обновить целевую таблицу (возможно, один MERGE
).
Если вы хотите остаться в T-SQL, сверните количество выполненных заявлений. Используйте логику на основе набора.
Все это упрощается/сокращается. Я упустил много соображений, потому что они слишком долго для ответа на переполнение стека. Имейте в виду, что лучшая стратегия зависит от многих факторов. Вы можете задать дополнительные вопросы в комментариях.
Не делайте этого с С#, если вам это не нужно, это огромные накладные расходы, и SQL может сделать это намного быстрее и лучше сам по себе
Вставка в таблицу из файла XML с помощью INSERT INTO SELECT
SELECT
на строку. Я вижу это много. Просто запросите все данные за один раз. Вы также можете читать по нескольким темам, если вы можете заставить это работать. Вам нужно как-то разделить данные, возможно, по диапазону идентификаторов. PLINQ очень хорош для этих вещей.