触发器里面的inserted 及deleted两个表怎么判断是更新的行还是新增的行?

gac123 2005-07-20 08:05:28
触发器里面的inserted 及deleted两个表
用 inserted.PK=deleted.pK 比教即可以知道那些是更新的行
但是哪些行是新增的用什么判断?
...全文
336 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
rivery 2005-07-27
楼主知道
inserted.PK=deleted.pK 比教即可以知道那些是更新的行
那么应该会知道
inserted 中有,deleted中没有的记录都是新增的行。
回复
quansui 2005-07-27
这样简单点
if exists (select * from inserted) and not exists (select * from deleted) --insert
begin
。。。。。。
end
else if exists (select * from deleted) and not exists (select * from inserted) --DELETE
begin
。。。。。。。。
end
回复
xhjdm 2005-07-25
select * from inserted where 主键 not in (select 主键 from deleted)
这就是inserted 表里面有 而deleted 表里面没有的数据

如果觉得这样速度慢,你完全可以把你的触发器分成for update 和for insert两个
这样就不需要判断inserted 表里面有 而deleted 表里面没有的数据了
回复
suxylin 2005-07-25
不要把触发器做在一起,那样会不会出现问题的。我很少用触发器,也不是很了解
这是以前学过有点印象。。。
错误之处请大家指正。
回复
good_luck898 2005-07-25
我也觉得分开触发器来执行会比两个一起的好,因为它一开始判断出来,马上就执行,而你两个混在一起的话,它需要先判断是否为更新的
回复
bugchen888 2005-07-25
分开触发器是个好办法。
回复
gac123 2005-07-21
是不是一定要用游标,一条条判断才可以啊?
回复
gac123 2005-07-21
对,是指对A表新增或修改时,使B表已有的记录侧更新,B表没有的侧新增(A,B二个表的结构完全一样)
回复
gac123 2005-07-21
这样也行不通啊,因为我的触发器写 在
CREATE TRIGGER dbo.tr_insertpaydis ON dbo.joinman
FOR update,insert AS
--------------------------------------人员有新增加时侧新增加
BEGIN

这样写还是判断不出哪些记录要更新,哪些记录要新增

回复
heguosheng 2005-07-21
up
回复
bugchen888 2005-07-20
if (select count(*) from deleted) >0--表示插入
--这里直接使用你原来的SQL
else --表示更新
--这里的SQL做如下修改
from deleted d,inserted i
where d.A=i.A
and d.B=i.B
and d.C=i.C
回复
gac123 2005-07-20
实际上,你只要写一个查询能帮我把 inserted 表里面有 而deleted 表里面没有的数据就可以了
,我用 in 也可以实现,但是速度很慢
回复
gac123 2005-07-20
有一个表 person 里面有 A B C D等字段
另一个表 dis 里面 也有 A B C 字段

现在 如果 person 是更新的时候 就更新 dis 里面的 A B C
如果 person 是新增的时候 就 新增 dis 里面的 A B C
回复
filebat 2005-07-20
你加一点文字说明吧.(实现什么功能, 表结构)

光代码看起来好难受.
回复
gac123 2005-07-20
CREATE TRIGGER dbo.tr_insertpaydis ON dbo.joinman
FOR update,insert AS
--------------------------------------人员有新增加时侧新增加
BEGIN

begin
declare @rows int
select @rows = @@rowcount
if @rows = 0
return
--------------------以下为新增加时
INSERT INTO paydis
SELECT inserted.ucode,inserted.pcode,inserted.thisyear,
isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-01-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0),
0,
1990-1-1,
isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-02-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0),
0,
1990-1-1,
isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-03-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0),
0,
1990-1-1,
isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-04-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0),
0,
1990-1-1,
isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-05-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0),
0,
1990-1-1,
isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-06-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0),
0,
1990-1-1,
isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-07-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0),
0,
1990-1-1,
isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-08-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0),
0,
1990-1-1,
isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-09-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0),
0,
1990-1-1,
isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-10-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0),
0,
1990-1-1,
isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-11-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0),
0,
1990-1-1,
isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-12-01') as datetime) then inserted.thisyearmoney - round((inserted.thisyearmoney/12),2)*11 else 0 end,2),0) ,
0,
1990-1-1
from inserted ----------这里用什么条件??????????

--------------------------以下为更新时执行
update paydis set
paydis.m1=isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-01-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0) ,
paydis.m2=isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-02-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0) ,
paydis.m3=isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-03-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0) ,
paydis.m4=isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-04-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0) ,
paydis.m5=isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-05-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0) ,
paydis.m6=isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-06-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0) ,
paydis.m7=isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-07-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0) ,
paydis.m8=isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-08-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0) ,
paydis.m9=isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-09-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0) ,
paydis.m10=isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-10-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0) ,
paydis.m11=isnull(round(case when inserted.jiondate<=cast ((str(year(inserted.thisyear)) +'-11-01') as datetime) then inserted.thisyearmoney/12 else 0 end,2),0) ,
paydis.m12=isnull(round(case when jiondate<=cast ((str(year(inserted.thisyear)) +'-12-01') as datetime) then thisyearmoney - round((inserted.thisyearmoney/12),2)*11 else 0 end,2),0)
from paydis,inserted
where inserted.pcode=paydis.pcode and inserted.thisyear=paydis.thisyear ----------这里用什么条件???


end


if @@error <> 0
begin
RAISERROR ('error', 16, 1)
rollback transaction
return
end

END









回复
filebat 2005-07-20
你把需求和数据贴出来吧.

反正,理论上就是上面说的那些.
回复
gac123 2005-07-20
主要是要做到 当表中已有时更新,没有时侧新增,我以前是用游标的但是速度很慢,
回复
gac123 2005-07-20
可以给个具体的条件吗?我用 insert into select 做新增 用update 做更新,就是判断不对啊,更新没问题 我用的是 join on inserted.PK=deleted.pK

但是新增总是不上去啊
回复
filebat 2005-07-20
新增的行只会出inserted表中有存在.

而更新的行, 在deleted表和inserted的表中都存在.(update=delete+insert)
回复
相关推荐
发帖
应用实例
创建于2007-09-28

2.7w+

社区成员

MS-SQL Server 应用实例
申请成为版主
帖子事件
创建了帖子
2005-07-20 08:05
社区公告
暂无公告