2

LightSwitch アプリケーションから SQL Server の保持テーブルに Excel データをインポートした後、レコードが重複してしまいます。LightSwitch から実行できる重複、または挿入後に SQL で自動的に実行される重複を削除する方法が必要です。トリガーについて考えましたが、それが最善の解決策かどうかはわかりません。重複はこのようなものになります

DocName|DocUser|DocType|DocDate|
test    user1   word    10/12/2012
test    user1   word    10/12/2012
test2   user2   word    10/11/2012
test2   user2   word    10/12/2012

重複の最初のセットの場合、いずれかのレコードを削除できるため、1 つのレコードがあります。ただし、2 番目のケースでは、2012 年 10 月 11 日の日付のレコードを削除する必要があります。LightSwitch から実行できるのであれば、ストアド プロシージャは好きではありません。一連のクエリで実行できることはわかっていますが、LightSwitch からどのように実行できるかわかりません。

4

2 に答える 2

2

私は Lightswitch の経験がないので、これが関係ない場合は申し訳ありませんが、SQL 側から言えば、重複を削除するために使用できるストアド プロシージャは次のとおりです。

CREATE PROCEDURE dbo.DeleteDuplicatesFromT
AS
BEGIN
    WITH CTE AS 
    (   SELECT  DocName, 
                DocUser, 
                DocType, 
                DocDate, 
                [RowNumber] = ROW_NUMBER() OVER(PARTITION BY DocName, DocUser, DocType ORDER BY DocDate DESC)
        FROM    T
    )
    DELETE  CTE
    WHERE   RowNumber > 1;
END

SQLFiddle の例

でも

挿入段階の前/段階でこれを管理することをお勧めします。アプリケーションコードでこれを行い、最初に一意のレコードのみがテーブルに渡されるようにするか、手順を再度使用して挿入を実行します。後者を行うには、最初TYPEに新しいレコードを処理するを作成する必要があります。

CREATE TYPE dbo.TableTypeParameter AS TABLE
(   DocName VARCHAR(5), 
    DocUser VARCHAR(5), 
    DocType VARCHAR(4), 
    DocDate DATETIME
);

これを (System.Data.DataTable を使用して) クライアント コードに入力し、これをパラメーターとしてストアド プロシージャに渡すことができます。

CREATE PROCEDURE dbo.BulkInsert @NewRecords dbo.TableTypeParameter READONLY
AS
BEGIN
    WITH NewRecords AS
    (   SELECT  DocName, DocType, DocUser, DocDate = MAX(DocDate)
        FROM    @NewRecords
        GROUP BY DocName, DocType, DocUser
    )
    MERGE INTO T 
    USING NewRecords nr 
        ON T.DocName = nr.DocName
        AND T.DocType = nr.DocType
        AND T.DocUser = nr.DocUser
    WHEN MATCHED AND nr.DocDate > T.DocDate THEN UPDATE
        SET DocDate = nr.DocDate
    WHEN NOT MATCHED THEN INSERT (DocName, DocUser, DocType, DocDate)
        VALUES (nr.DocName, nr.DocUser, nr.DocType, nr.DocDate);

END;

編集

これが必要な場合、挿入する手順はかなり簡単にトリガーに変えることができます。

CREATE TRIGGER dbo.T_InsteadOfInsert 
    ON T
    INSTEAD OF INSERT
AS
BEGIN
    WITH NewRecords AS
    (   SELECT  DocName, DocType, DocUser, DocDate = MAX(DocDate)
        FROM    inserted
        GROUP BY DocName, DocType, DocUser
    )
    MERGE INTO T 
    USING NewRecords nr 
        ON T.DocName = nr.DocName
        AND T.DocType = nr.DocType
        AND T.DocUser = nr.DocUser
    WHEN MATCHED AND nr.DocDate > T.DocDate THEN UPDATE
        SET DocDate = nr.DocDate
    WHEN NOT MATCHED THEN INSERT (DocName, DocUser, DocType, DocDate)
        VALUES (nr.DocName, nr.DocUser, nr.DocType, nr.DocDate);

END
于 2012-10-16T19:46:25.073 に答える
0

MSDN フォーラムのユーザーは、Excel Importer を使用して同様の問題を抱えていました。彼は、既存の重複のエントリを防止および削除するために、テーブルをチェックおよび検証する関数をいくつか作成しました。見てみましょう: Automatic Validation Error Handling

于 2012-10-17T11:50:44.283 に答える