Sql server 2008 r2 SQL Server中具有相同insert语句的重复项
我对SQL Server 2008 R2中的重复条目有困难。由于该计划的性质,我被告知独特的限制不是一个选项 请有人帮忙,因为我试过插入触发器,但运气不好 表结构: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
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”附近语法不正确。