Sql server 2008 r2 SQL Server中具有相同insert语句的重复项

Sql server 2008 r2 SQL Server中具有相同insert语句的重复项,sql-server-2008-r2,Sql Server 2008 R2,我对SQL Server 2008 R2中的重复条目有困难。由于该计划的性质,我被告知独特的限制不是一个选项 请有人帮忙,因为我试过插入触发器,但运气不好 表结构: col1 - identity col2 - filename col3 - date col4 - filetype col5 - process col6 - userid col7 - info 当我第一次运行此insert时,它会输入两个条目。我不想要的是: insert into table(filename, file

我对SQL Server 2008 R2中的重复条目有困难。由于该计划的性质,我被告知独特的限制不是一个选项

请有人帮忙,因为我试过插入触发器,但运气不好

表结构:

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

谢谢

您还必须检查插入的行本身是否存在重复项,因此表扫描是不够的。您可以将插入的
中的
计数(*)与
计数(不同的文件名、日期)进行比较

您还必须将INSERT的
替换为
,而不是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 
但是,还必须创建更新触发器


编辑:这里有一个

插入的
是一个表而不是一条记录,您必须将它与插入表连接起来。您需要将
raiserror
rollback
放入
else
案例中的
开始。。。。结束
代码块-否则,每次触发器运行时都将执行
回滚
!尝试了上述操作,但仍会创建重复条目。你能解释一下更新触发器的作用吗。这是我第一次尝试这些触发器。@user1854183:我还没有尝试过上面的方法,所以我必须承认我不确定它是否有效,也许它比必要的更复杂。您必须提供具有相同规则的更新触发器,因为有人可以修改记录,使其成为重复记录。谢谢。我不确定我是否做错了什么,但它仍然会在第一次和第二次循环中插入两个条目,这只会告诉我该文件存在。@user1854183:请再次查看;)我在尝试创建触发器时遇到两个错误:Msg 102,级别15,状态1,过程停止\u重复,第14行“,”附近的语法不正确。Msg 156,级别15,状态1,过程停止\u重复,第20行关键字“ELSE”附近语法不正确。