2017-02-22 6 views
1

мне нужно импортировать около 100k записей нескольких десятков раз в день в AWS принимали SQL Server Web 13.00.2164.0.v1Sql сервер большого импорта без массового копирования или SSIS

AWS не поддерживает массовую вставку, и SQL Server Web не поддерживает SSIS.

Я читаю записи из файла csv с помощью приложения консоли C#, выполняя некоторые преобразования данных, а затем вставляя по одной записи за один раз с помощью SqlCommand под одной транзакцией за 100k файл записи.

Мой текущий показатель составляет около 25 тыс. Записей за 30 минут, что кажется нелепо медленным. Я изначально разработал этот процесс с использованием объемных вставок и мог получить 100 тыс. Записей, вставленных примерно через минуту. Я могу что-то сделать, чтобы ускорить это?

ответ

1

Уроженец способ сделать это состоит в использовании Table-Valued Parameters.

См. Также Table-Valued Parameters in .NET для объяснения того, как их использовать в коде C#.

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

В этой хранимой процедуре будет один оператор INSERT, который вставляет строки из таблицы параметров в постоянную таблицу.

Это будет определенно быстрее, чем вставка одной строки за раз.

1

Вы должны преобразовать ваши данные в формате xml и затем перенести данные xml в sql. Подобно приведенному ниже примеру

получение данных из набора данных в формате xml. строка objStr = ds.GetXml(); // DS является объектом набора данных, который содержит табличные данные

в конце баз данных:

CREATE PROCEDURE [dbo].[procedure name] 
    -- Add the parameters for the stored procedure here 
    @Val varchar(max) = null 

AS 
BEGIN 
    declare @xml xml 
    set @xml = convert(xml,@Val) 

    SELECT 
     T.Node.value('colname[1]', 'numeric(18, 2)') AS colname 
    FROM 
     @xmlValue.nodes('/NewDataSet/Table0') AS T(Node) 
END 
+0

Это должно сделать красиво. Я планирую реализовать расширение для SqlBulkCopy, которое принимает имя таблицы назначения, сопоставления полей и исходную таблицу и динамически создает соответствующую процедуру. Спасибо за толкание в правильном направлении. Я пометю признанный и отправлю свой окончательный результат, как только я его запустил. – Broom