按LIANGCK的方法,最后得出: CREATE TRIGGER c_intect ON [dbo].[L_DAYLOG] instead of INSERT AS SET NOCOUNT ON insert L_DAYLOG(ID,L_XAY,L_NAME) select ID,L_XAY,L_NAME from inserted where not exists( select 1 from L_DAYLOG, inserted where L_DAYLOG.L_XAY=inserted.L_XAY)
有一表 L_DAYLOG 字段类型: ID INT L_XAY varchar(10)--主键值 L_NAME varchar(5) 要求写一触发器,在用户新增或修改保存时检查L_XAY是否有重复的值,没有时将数据写入表,有时放弃写入数据ID L_XAY L_NAME 001 FH0024 王五 002 FH0142 李四 003 AZ0432 王五 004 LA0478 李四 ------------------------------写个例子create trigger Tr_L_DAYLOG on L_DAYLOG instead of insert, update asif not update(L_XAY)--没有更新L_XAY列时不触发下面语句 return if not exists(select 1 from deleted )--判断新增操作 insert L_DAYLOG select * from inserted i where not exists(select 1 from L_DAYLOG where L_XAY=i.L_XAY) else --其它更新 update l set L_XAY=i.L_XAY from inserted i join L_DAYLOG l on i.ID=l.ID where not exists(select 1 from L_DAYLOG where L_XAY=i.L_XAY)
无奈在插入大量记录时,速度实在不行,既然roy_88说可以用储过程处理,还请多多指教,无限感激! ------------- 楼主是通过怎样的方式插入记录? if not update(L_XAY)--去掉 刚测了一个: create table L_DAYLOG(ID char(3) ,L_XAY varchar(10), L_NAME varchar(5))insert L_DAYLOG values('001', 'FH0024', '王五') insert L_DAYLOG values('002', 'FH0142', '李四') insert L_DAYLOG values('003', 'AZ0432', '王五') insert L_DAYLOG values('004', 'LA0478', '李四') goif object_id('Tr_L_DAYLOG','TR') is not null drop trigger Tr_L_DAYLOG go create trigger Tr_L_DAYLOG on L_DAYLOG instead of insert, update asif not exists(select 1 from deleted )--判断新增操作 insert L_DAYLOG select * from inserted i where not exists(select 1 from L_DAYLOG where L_XAY=i.L_XAY) else
update l set L_XAY=i.L_XAY from inserted i join L_DAYLOG l on i.ID=l.ID where not exists(select 1 from L_DAYLOG where L_XAY=i.L_XAY) go --测试新增 insert L_DAYLOG values('005', 'LA0478', '李四') select * from L_DAYLOG--查看数据没变化 /* ID L_XAY L_NAME ---- ---------- ------ 001 FH0024 王五 002 FH0142 李四 003 AZ0432 王五 004 LA0478 李四(所影响的行数为 4 行) */insert L_DAYLOG values('005', 'LA0008', '李四') --改一下L_XAYgo select * from L_DAYLOG /* ID L_XAY L_NAME ---- ---------- ------ 001 FH0024 王五 002 FH0142 李四 003 AZ0432 王五 004 LA0478 李四 005 LA0008 李四(所影响的行数为 5 行) */--测式更新 update L_DAYLOG set L_XAY='LAA0478'--不存在 where L_XAY='LA0478'update L_DAYLOG set L_XAY='FH0024'--存在 where L_XAY='AZ0432'select * from L_DAYLOG/* ID L_XAY L_NAME ---- ---------- ------ 001 FH0024 王五 002 FH0142 李四 003 AZ0432 王五 004 LAA0478 李四 005 LA0008 李四 */
CREATE TRIGGER c_intect ON [dbo].[L_DAYLOG]
instead of INSERT
AS
SET NOCOUNT ON
insert L_DAYLOG(ID,L_XAY,L_NAME)
select ID,L_XAY,L_NAME from inserted
where not exists(
select 1 from L_DAYLOG, inserted
where L_DAYLOG.L_XAY=inserted.L_XAY)
SET NOCOUNT OFF现在就是要考虑速度的问题,有高见吗?
新增或修改保存时检查L_XAY是否有重复的值?
-------------------------------------
什么情况?
ID L_XAY L_NAME
001 FH0024 王五
002 FH0142 李四
003 AZ0432 王五
004 LA0478 李四
字段类型:
ID INT
L_XAY varchar(10)--主键值
L_NAME varchar(5) 要求写一触发器,在用户新增或修改保存时检查L_XAY是否有重复的值,没有时将数据写入表,有时放弃写入数据ID L_XAY L_NAME
001 FH0024 王五
002 FH0142 李四
003 AZ0432 王五
004 LA0478 李四
------------------------------写个例子create trigger Tr_L_DAYLOG on L_DAYLOG
instead of insert, update
asif not update(L_XAY)--没有更新L_XAY列时不触发下面语句
return
if not exists(select 1 from deleted )--判断新增操作
insert L_DAYLOG
select
*
from
inserted i
where
not exists(select 1 from L_DAYLOG where L_XAY=i.L_XAY)
else --其它更新
update l
set L_XAY=i.L_XAY
from
inserted i
join
L_DAYLOG l on i.ID=l.ID
where
not exists(select 1 from L_DAYLOG where L_XAY=i.L_XAY)
-------------
楼主是通过怎样的方式插入记录?
if not update(L_XAY)--去掉
刚测了一个:
create table L_DAYLOG(ID char(3) ,L_XAY varchar(10), L_NAME varchar(5))insert L_DAYLOG values('001', 'FH0024', '王五')
insert L_DAYLOG values('002', 'FH0142', '李四')
insert L_DAYLOG values('003', 'AZ0432', '王五')
insert L_DAYLOG values('004', 'LA0478', '李四')
goif object_id('Tr_L_DAYLOG','TR') is not null
drop trigger Tr_L_DAYLOG
go
create trigger Tr_L_DAYLOG on L_DAYLOG
instead of insert, update
asif not exists(select 1 from deleted )--判断新增操作
insert L_DAYLOG
select
*
from
inserted i
where
not exists(select 1 from L_DAYLOG where L_XAY=i.L_XAY)
else
update l
set L_XAY=i.L_XAY
from
inserted i
join
L_DAYLOG l on i.ID=l.ID
where
not exists(select 1 from L_DAYLOG where L_XAY=i.L_XAY)
go
--测试新增
insert L_DAYLOG values('005', 'LA0478', '李四') select * from L_DAYLOG--查看数据没变化
/*
ID L_XAY L_NAME
---- ---------- ------
001 FH0024 王五
002 FH0142 李四
003 AZ0432 王五
004 LA0478 李四(所影响的行数为 4 行)
*/insert L_DAYLOG values('005', 'LA0008', '李四') --改一下L_XAYgo
select * from L_DAYLOG
/*
ID L_XAY L_NAME
---- ---------- ------
001 FH0024 王五
002 FH0142 李四
003 AZ0432 王五
004 LA0478 李四
005 LA0008 李四(所影响的行数为 5 行)
*/--测式更新
update L_DAYLOG
set L_XAY='LAA0478'--不存在
where
L_XAY='LA0478'update L_DAYLOG
set L_XAY='FH0024'--存在
where
L_XAY='AZ0432'select * from L_DAYLOG/*
ID L_XAY L_NAME
---- ---------- ------
001 FH0024 王五
002 FH0142 李四
003 AZ0432 王五
004 LAA0478 李四
005 LA0008 李四
*/
方式是一条一条的insert values
还是insert select