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

本文关键字:sql server 解决方案 唯一 数据 导入 | 更新日期: 2023-09-27 18:19:16

我们需要定期导入一个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。

thank you so much

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

您不能直接使用SqlBulkCopy做您想做的事情。但是,您可以将这些行批量复制到一个工作表中,然后使用MERGE语句进行更新或插入。

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

假设SpecimenTable不是objSBC.DestinationTableName,而是设置为StagingSpecimenTable。stagingabentable是abentable结构的副本。然后,在批量复制之后,您可以使用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 )

那么您必须删除或截断stagingprohientable以及ResultTable的类似操作

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

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

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

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