2014-01-31 54 views
1

我在SQL Server 2008 R2中的重复条目中遇到困难。由于该计划的性质,我被告知独特的约束不是一种选择。SQL Server中具有相同插入语句的重复条目

有人可以请帮助,因为我已经尝试了插入触发器,但没有运气。

表结构:

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 

谢谢

+1

'inserted'是表不是一个单一的记录,你有插入表加入。 –

+0

您需要将'else'中的'raiserror'和'rollback'放入'BEGIN .... END'代码块中,否则每次触发器运行时都会执行'ROLLBACK'! –

回答

1

您还必须检查是否有与插入行本身的重复,所以表扫描是不够的。您可以将COUNT(*)..COUNT(DISTINCT FileName,Date)FROM INSERTED进行比较。

你也必须更换FOR INSERTINSTEAD 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

+0

尝试了上面的操作,它仍然创建了重复条目。你能解释一下更新触发器的用途吗?这是我第一次接触这些触发器。 – user1854183

+0

@ user1854183:我还没有尝试过,所以我必须承认,我不确定它是否有效,也许它比必要更复杂。您必须提供具有相同规则的更新触发器,因为有人可以修改记录以使其成为重复记录。 –

+0

谢谢。我也会创建一个更新触发器。 – user1854183