我在SQL Server 2008 R2中遇到重复条目很困难。由于程序的性质,我被告知独特的约束不是一种选择。
有人可以帮助我,因为我尝试了一个For Insert Trigger但没有运气。
表格结构:
col1 - identity
col2 - filename
col3 - date
col4 - filetype
col5 - process
col6 - userid
col7 - info
当我第一次运行此insert
时,它会输入两个条目。我不想要的是:
insert into table(filename, filetype,process, userid)
values
('test9','import','view','tester'),
('test9','import','view','tester')
条目现在在表中两次,唯一的区别是标识列。
Identity Filename Date Filetype Process Userid Info
17 Test9 2014-01-31 Import View test null
18 Test9 2014-01-31 Import View test null
当我第二次运行完全相同的插入时,它不会插入,因为它然后将其视为重复。为什么它第一次没有看到它是重复的?
这是我创建的触发器:
Create trigger check_duplicates
on table
for insert
as
if not exist (select p.filename, p.date
from table p, inserted i
where p.filename = i.filename and p.date = i.date)
insert into table
select filename, date, filetype, process, userid, info
from inserted
else
raiserror('Duplicate file exist',16,1)
rollback
end
谢谢
答案 0 :(得分:1)
您还必须检查插入行本身是否存在重复项,因此表扫描是不够的。您可以将COUNT(*)..
与COUNT(DISTINCT FileName,Date)FROM INSERTED
进行比较。
您还必须将FOR INSERT
替换为INSTEAD OF INSERT
:
试试这个:
CREATE trigger [dbo].[check_duplicates]
on [dbo].[TableName]
INSTEAD OF INSERT
as
IF NOT EXISTS
(
SELECT 1
FROM dbo.TableName T
INNER JOIN INSERTED I
ON T.FileName= I.FileName AND T.Date= I.Date
)
AND (SELECT COUNT(*) FROM INSERTED) =
(SELECT COUNT(DISTINCT CHECKSUM(FileName, Date)) FROM INSERTED)
BEGIN
INSERT INTO dbo.TableName
SELECT FileName, Date, filetype, process, userid, info
FROM INSERTED
END
ELSE
BEGIN
ROLLBACK
RAISERROR('Duplicate file exist',16,1)
END
但是,您还必须创建更新触发器。
修改:这是 Demo