Синхронизация базы данных из файлов CSV - PullRequest
1 голос
/ 06 января 2012

Мне нужны идеи для проблемы, над которой я работаю:

Я пишу синхронизатор данных в C # .Net, который будет принимать файлы CSV, по одному для каждой таблицы в базе данных SQL Server.

Некоторые строки в файлах csv будут ссылаться на существующие строки в базе данных, требующие обновления, а некоторые - на новые строки, требующие вставки.

Поскольку файлов может быть много (20 илитак) и потенциально много строк в каждой, как я могу сделать это масштабируемым?Чтение одной строки за раз, подключение к базе данных, чтобы убедиться, существует ли строка с тем же идентификатором или нет (чтобы убедиться, что это обновление или вставка), а затем создание другого соединения для фактического обновления или вставки кажется расточительным.

Ответы [ 4 ]

3 голосов
/ 06 января 2012
  1. Загрузить все во временную таблицу (массовая вставка)

  2. Выполнить обновление слияния для целевой таблицы.

2 голосов
/ 06 января 2012

Вы должны использовать SQL Server Integration Services для такого рода работы.

SSIS - это платформа для приложений интеграции данных и рабочих процессов. Он оснащен быстрым и гибким инструментом хранения данных, который используется для извлечения, преобразования и загрузки данных (ETL).

0 голосов
/ 09 января 2012

Наилучшим способом будет использование служб SSIS. В службах SSIS имеется компонент для чтения csv (источник плоских файлов), который обрабатывает все типы плоских файлов (конвейер или табуляции с разделителями и т. Д.). С помощью функции Lookup можно проверить существующую строку в таблицу, а затем вы можете обновить, вставить или удалить, используя компонент Oledb.

Если вы не хотите использовать SSIS, существует другой способ использования хранимой процедуры XML. Вместо попадания в базу данных для каждой строки вы можете передать данные в виде XML и затем манипулировать в хранимой процедуре.

Пример: вставка данных в таблицу с использованием XML в качестве источника

            CREATE PROCEDURE [dbo].[sp_Insert_XML]
        @XMLDATA xml

AS

НАЧАТЬ

SET NOCOUNT ON;
-- Insert statements for procedure here
Insert into RCMReport(
   ProjectName
  ,Category
  ,EndTime)
    Select  
        XMLDATA.item.value('@ProjectName[1]', 'varchar(255)') AS ProjectName,   
        XMLDATA.item.value('@Category[1]', 'varchar(200)') AS Category,
        XMLDATA.item.value('@EndTime[1]', 'datetime') AS EndTime
            FROM @XMLDATA.nodes('//RCMReport/InsertList') AS XMLDATA(item) 
0 голосов
/ 06 января 2012

Также хорошим источником для использования может быть CsvReader

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...