导入唯一的数据 - c#/ sql server解决方案

时间:2012-01-03 22:28:33

标签: c# sql sql-server sql-server-2008

我们定期需要导入如下所示的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 个答案:

答案 0 :(得分:4)

您无法直接使用SqlBulkCopy执行所需操作。但是,您可以将行批量复制到工作表中,然后使用MERGE语句进行更新或插入。

但是,这确实需要您的源信息具有足够的信息来唯一标识每一行。

让我们假设,SpecimenTable代替objSBC.DestinationTableName而不是StagingSpecimenTable,它被设置为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 ) 。 StagingSpecimenTablebeing SpecimenTable struture的副本。然后在批量复制之后,您可以使用SqlCommand

执行此语句
{{1}}

然后你必须删除或截断StagingSpecimenTable以及ResultTable的类似操作

答案 1 :(得分:1)

您需要Data deduplication机制来检测之前导入的记录,为此您需要具有能够查找重复数据删除记录的逻辑。

你的逻辑是什么?例如,您可以将SpecID设置为主要的重复数据删除规则,这意味着如果您的SpecID与数据库中的数据相同,则不要导入它,否则导入它。

或者您可以为您的规则组合字段,例如“Name + SpecID”,甚至可以收集所有字段。在这种情况下,我建议使用一个辅助字段,您可以在其中存储MD5(或任何其他散列机制)来存储在重复数据删除规则中组合所有字段的散列值,然后在插入之前需要为新值生成散列并检查它是否已经通过查询辅助字段存在于表中。

这可能有点令人困惑,但逻辑非常简单。如果您需要更多帮助,请告诉我:-)