根据日期或计数自动删除重复的SQL记录

时间:2012-10-16 17:42:04

标签: sql visual-studio-lightswitch

将LightSwitch应用程序中的Excel数据导入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执行?

2 个答案:

答案 0 :(得分: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

Example on 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

答案 1 :(得分:0)

MSDN论坛上的用户使用Excel导入器时遇到了类似的问题。他写了一些函数来检查和验证他的表,以防止输入和删除现有的重复项。看看:Automatic Validation Error Handling