импорт уникальных данных - серверное решение c # / sql - PullRequest
1 голос
/ 04 января 2012

нам периодически нужно импортировать CSV, который выглядит следующим образом:

Name,SpecID,TestResult1,TestResult2,TestResult3
Alex,ASD123,3.23,452.2,232
Craig,DFG444,453.56,345.3,23

данные сохраняются следующим образом:

SPECIMENTABLE (name,specid,SPECIMENTABLEID)
Alex,ASD123,1
Craig,DFG444,2

и

    RESULTTABLE (testresult,result,SPECIMENTABLEID)
    TestResult1,3.23,1
    TestResult2,452.2,1
    TestResult3,232,1
    TestResult1, 453.56,2
    etc

я сбрасываю данные следующим образом:

    public void DumpQuickLabDump()
    {
        // T-SQL Connection
        string connection = "Data Source=gaia;Initial Catalog=SalesDWH;Integrated Security=True";


        // Get the data into the DataTable
        //dtData = GetData(...);

        // Create an object of SqlBulkCopy
        SqlBulkCopy objSBC = new SqlBulkCopy(connection);
        // Specify the destination table
        objSBC.BulkCopyTimeout = 0;
        objSBC.BatchSize = 10000;
        objSBC.DestinationTableName = "SpecimenTable";
        // Write the data to the SQL Server

        objSBC.WriteToServer(QuickLabDump);
    }
    public void DumpTestResults()
    {
        // T-SQL Connection
        string connection = "Data Source=gaia;Initial Catalog=SalesDWH;Integrated Security=True";


        // Get the data into the DataTable
        //dtData = GetData(...);

        // Create an object of SqlBulkCopy
        SqlBulkCopy objSBC = new SqlBulkCopy(connection);
        // Specify the destination table
        objSBC.BulkCopyTimeout = 0;
        objSBC.BatchSize = 10000;
        objSBC.DestinationTableName = "ResultTable";
        // Write the data to the SQL Server

        objSBC.WriteToServer(TestResults);
    }

иногда клиент отправляет мне CSV для загрузки, а затем, через несколько дней, он импортирует другой CSV, но он будет иметь процент от тех же записей.

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

решение может быть .NET или sql.

большое спасибо

Ответы [ 2 ]

4 голосов
/ 04 января 2012

Вы не можете делать то, что хотите, используя SqlBulkCopy напрямую.Однако вы можете массово скопировать строки в рабочую таблицу, а затем использовать оператор MERGE для обновления или вставки.

Однако для этого требуется, чтобы в исходной информации было достаточно информации для уникальной идентификации каждой строки.

Предположим, например, что вместо SpecimenTable было objSBC.DestinationTableName, для него было установлено StagingSpecimenTable.StagingSpecimenTable, являющийся копией таблицы SpecimenTable.Затем, после массового копирования, вы можете выполнить этот оператор с помощью SqlCommand

MERGE SpecimenTable AS target
USING (SELECT name,specid FROM StagingSpecimenTable) 
     AS source (StagingSpecimenTable)
ON ( target.specid = source.specid )
WHEN MATCHED 
    THEN UPDATE SET target.mame= source.name
WHEN NOT MATCHED 
    THEN INSERT  (name, specid )
    VALUES (source.name, source.specid )

Затем вам нужно будет удалить или усечь StagingSpecimenTable, а также аналогичную операцию для ResultTable

1 голос
/ 04 января 2012

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

Какая у вас логика?Например, вы можете установить SpecID в качестве основного правила дедупликации, что означает, что если ваш SpecID совпадает с данными, которые есть в вашей базе данных, то не импортируйте его, иначе импортируйте его.

Или вы можете использовать комбинациюполя для вашего правила, такие как «Имя + SpecID» или даже все поля для сбора.В таких случаях я рекомендую использовать вспомогательное поле, в котором вы можете хранить MD5 (или любой другой механизм хеширования) для хранения значения хеш-функции, объединяющего все ваши поля в правиле дедупликации, затем перед вставкой вам нужно сгенерировать хеш для новых значений и проверить, уже ли этосуществовать в вашей таблице, запрашивая на вашем поле помощника.

Это может немного сбивать с толку, но логика действительно проста.Пожалуйста, дайте мне знать, если вам нужна дополнительная помощь по этому вопросу :-)

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