将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执行?
答案 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
<强>无论其强>
我建议在插入阶段之前/期间管理它,您可以在应用程序代码中执行此操作,并确保只将唯一记录传递给表开始,或再次使用过程来执行插入。要完成后者,您首先需要创建一个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。