2

将 Excel 数据从 LightSwitch 应用程序导入 SQL Server 中的保存表后,我最终得到了重复记录。我需要一种方法来删除可以从 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

在第一组重复的情况下,可以删除任何一条记录,所以我有一条记录。但是,在第二种情况下,需要删除日期为 10/11/2012 的记录。如果可以从 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 导入器时遇到了类似的问题。他编写了一些函数来检查和验证他的表,以防止输入和删除现有的重复项。看一看:自动验证错误处理

于 2012-10-17T11:50:44.283 回答