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

标签 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。

非常感谢

最佳答案

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

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

例如,假设 SpecimenTableobjSBC.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 的类似操作

关于c# - 导入唯一的数据 - c#/sql server 解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8719545/

相关文章:

sql - 如何合并不同表中的范围

mysql查询无法识别字符串

sql - 查询 SQL 字段是否包含多个值中的任意一个

sql-server - 在 SQL Server 中生成递增数字的函数

c# - 找不到 DATABASE.SQLPERMISSIONS

c# - 该进程无法访问该 exe 文件,因为它正被另一个进程使用

c# - 将消息从网站发布到 Facebook 墙

c# - 使用数据适配器更新在 .NET 中使用 ACE 超时的 Excel

sql-server - 如何在 Power Pivot 中更改表的连接

c# - 使用 Dapper 从 T-SQL 存储过程返回 XML 字符串