Массовая вставка Sql Server миллионы записей

У меня есть приложение Windows Service, которое получает поток данных со следующим форматом

IDX|20120512|075659|00000002|3|AALI                 |Astra Agro Lestari Tbk.                                     |0|ORDI_PREOPEN|12  |00000001550.00|00000001291.67|00001574745000|00001574745000|00500|XDS1BXO1|                                        |00001574745000|ݤ
IDX|20120512|075659|00000022|3|ALMI                 |Alumindo Light Metal Industry Tbk.                          |0|ORDI        |33  |00000001300.00|00000001300.00|00000308000000|00000308000000|00500|--U3---2|                                        |00000308000000|õÄ

Эти данные поступают в миллионы строк и последовательно 00000002....00198562, и мне приходится анализировать и вставлять их в соответствии с последовательностью в таблицу базы данных.

Мой вопрос: какой лучший способ (наиболее эффективный) вставить эти данные в мою базу данных? Я попытался использовать простой метод, чтобы открыть объект SqlConnection, а затем сгенерировать строку SQL insert script, а затем выполнить script с помощью объекта SqlCommand, однако этот метод занимает слишком много времени.

Я прочитал, что могу использовать Sql BULK INSERT, но он должен читать из текстового файла, возможно ли, чтобы этот сценарий использовал BULK INSERT? (Я никогда не использовал его раньше).

Спасибо

update: я знаю SqlBulkCopy, но для этого требуется, чтобы я сначала использовал DataTable, это хорошо для производительности? Если возможно, я хочу вставить прямо из моего источника данных в SQL Server без использования в памяти DataTable.

Ответ 1

Если вы пишете это на С#, вы можете посмотреть класс SqlBulkCopy.

Позволяет эффективно загружать таблицу SQL Server с данными из другого источника.

Ответ 2

Сначала загрузите бесплатную библиотеку LumenWorks.Framework.IO.Csv.

Во-вторых, используйте такой код

StreamReader sr = new TextReader(yourStream);
var sbc = new SqlBulkCopy(connectionString);
sbc.WriteToServer(new LumenWorks.Framework.IO.Csv.CsvReader(sr));

Да, это действительно так просто.

Ответ 3

Вы можете использовать SSIS "Sql Server Integration Service" для преобразования данных из исходного потока данных в целевой поток данных. Источником может быть текстовый файл, а местом назначения может быть таблица SQL Server. Ваше преобразование выполняется в режиме массовой вставки.