SQL批量上传,合并和删除记录

时间:2015-02-05 18:06:00

标签: sql merge sql-server-2008-r2 sqlbulkcopy

我正在创建一个ASP.net Web应用程序,它从用户接收CSV文件,将文件上传到服务器,批量复制数据到TempHoldingTable。然后代码调用一个包含Merge语句的存储过程,将数据从TempHoldingTable复制到相关的多个表。我正在使用SQL Server 2008 R2。

我在存储过程中有多个Merge语句,我在下面只复制了一个:

MERGE Client AS C
USING (SELECT ClientID, Value1, Value2, Value3, Row_Number() Over (PARTITION BY ClientID order by Date desc) as Rno 
       FROM TempHoldingTable) AS T ON (C.ClientID = T.ClientID)

WHEN NOT MATCHED BY TARGET AND T.Rno = 1
    THEN 
        INSERT(ClientID, Value1, Value2, Value3)
        VALUES(T.ClientID, Value1, Value2, Value3)                      
        OUTPUT $action, inserted.*, deleted.*;

每月上传CSV文件,因此我们假设第一个文件是在2014年1月上传的,并且有以下数据:

ClientID Value1 Value2 Value3
 111      abc    def    ghi
 222      jkl    mno    pqr

然后,用户在2014年2月上传第二个文件,其中包含以下数据:

ClientID Value1 Value2 Value3
 111      aaa    bbb    ghi
 222      jkl    mno    pqr
 333      sss    ttt    uuu

Merge例程将更新ClientID 111的客户端表,因为value1& value2已更改,保留ClientID 222并为ClientID 333插入新行。

我的问题是,如果用户决定删除2014年2月的文件,我如何跟踪和恢复因2014年2月上传而导致的更改,以便客户端表包含与2014年1月上载后相同的数据。 / p>

请注意,每次上传都需要进行此跟踪,以便每当用户删除文件时,数据库将恢复到与上个月相同的位置。

我的第二个问题是如果ClientID存在且任何列的值与前一列不同,如何修改Merge语句以更新值。

感谢您耐心阅读所有这些,我们将非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

回答Q1: 根据您的数据大小,我认为设置跟踪机制(Change tracking /CDC)将是一种矫枉过正(IMO)。您可以设置一个进程(在应用文件之前)将8个表中的每个表中的数据推送到另一组表(版本化数据集)中,该表根据月/年存储它。 如果用户决定删除特定月份文件,请从版本化数据集中取出上一个集合并将其应用于活动表格。

请记住为版本化数据集设置清除过程,否则它可能会超时增长。

答案Q2:您可以使用When Matched子句

MERGE Client AS C
USING (SELECT ClientID, Value1, Value2, Value3, Row_Number() Over (PARTITION BY ClientID order by Date desc) as Rno 
       FROM TempHoldingTable) AS T ON (C.ClientID = T.ClientID)

WHEN NOT MATCHED BY TARGET AND T.Rno = 1
    THEN 
        INSERT(ClientID, Value1, Value2, Value3)
        VALUES(T.ClientID, Value1, Value2, Value3)                      
WHEN MATCHED 
        THEN UPDATE SET C.Value1 = T.Value1
        , C.Value2 = T.Value2
        , C.Value3 = T.Value#3
OUTPUT $action, inserted.*, deleted.*;