SQL一括アップロード、マージ、および削除のレコード

merge sql sqlbulkcopy sql-server-2008-r2

質問

私はASP.net Webアプリケーションを作成しています。このアプリケーションは、ユーザーからCSVファイルを受け取り、ファイルをサーバーにアップロードし、 TempHoldingTable一括してコピーします。次に、コードは、 Mergeステートメントを含むストアドプロシージャを呼び出して、 TempHoldingTableから関連する複数のテーブルにデータをコピーします。私はSQL Server 2008 R2を使用しています。

ストアドプロシージャに複数のMergeステートメントがある場合、以下のステートメントを1つだけコピーしました。

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月に2番目のファイルをアップロードし、次のデータがあります。

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

マージルーチンは、値1と値2が変更されたためClientID 111のクライアントテーブルを更新し、ClientID 222をそのまま残してClientID 333の新しい行を挿入します。

私の質問は、2014年2月のファイルを削除することを決定した場合、2014年2月のアップロードに起因する変更を追跡して元に戻すことができるため、クライアントテーブルには2014年1月のアップロード後と同じデータが含まれます。

この追跡は、ユーザーがファイルを削除するたびにデータベースが前月と同じ位置に戻るように、アップロードごとに行う必要があることに注意してください。

私の2番目の質問は、ClientIDが存在し、いずれかの列が前の値と異なる値を持つ場合、Mergeステートメントを修正して値を更新する方法です。

このすべてを読んであなたの忍耐をありがとうと助けていただければ幸いです。

受け入れられた回答

Q1への回答:あなたのデータのサイズに基づいて、私はトラッキングメカニズム( Change tracking /CDC )の設定は過度の(IMO)と考えています。おそらく、(ファイルを適用する前に)8つのテーブルのそれぞれのデータを月/年に基づいてそれを格納する別のテーブルセット(バージョニングされたデータセット)にプッシュするプロセスをセットアップすることができます。ユーザーが特定の月ファイルを削除することを決定した場合は、以前のセットをVersioned Datasetから取り出し、それをアクティブなテーブルに適用します。

ただし、バージョン管理されたデータセットのパージプロセスをセットアップすることを忘れないでください。

Answer 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.*;


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ