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

狗头鱼.net 2005-07-20 08:05:28
触发器里面的inserted 及deleted两个表
用 inserted.PK=deleted.pK 比教即可以知道那些是更新的行
但是哪些行是新增的用什么判断?
...全文
400 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
  • 打赏
  • 举报
回复
分开触发器是个好办法。
狗头鱼.net 2005-07-21
  • 打赏
  • 举报
回复
是不是一定要用游标,一条条判断才可以啊?
狗头鱼.net 2005-07-21
  • 打赏
  • 举报
回复
对,是指对A表新增或修改时,使B表已有的记录侧更新,B表没有的侧新增(A,B二个表的结构完全一样)
狗头鱼.net 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
狗头鱼.net 2005-07-20
  • 打赏
  • 举报
回复
实际上,你只要写一个查询能帮我把 inserted 表里面有 而deleted 表里面没有的数据就可以了
,我用 in 也可以实现,但是速度很慢
狗头鱼.net 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
  • 打赏
  • 举报
回复
你加一点文字说明吧.(实现什么功能, 表结构)

光代码看起来好难受.
狗头鱼.net 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
  • 打赏
  • 举报
回复
你把需求和数据贴出来吧.

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

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

而更新的行, 在deleted表和inserted的表中都存在.(update=delete+insert)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧