请问大家一个触发器中更新语句的问题

请教大家一个问题,我在触发器要执行下面的操作
update t1 set t1.price=t2.price
from table 1,inserted t2
where t1.ID=t2.SourceID
and t2.SourceType='采购订单'

我需不需要在这个语句前面加一个if条件呢?比如:
if exists(select 1 from inserted where SourceType='采购订单')
begin

update t1 set t1.price=t2.price
from table 1,inserted t2
where t1.ID=t2.SourceID
and t2.SourceType='采购订单'

end

我在所有的触发器的第一行都有加
if @@rowcount=0 return

请问,如果不加if条件,会有可能存在什么隐患么?
...全文
171 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 14 楼 yupeigu 的回复:
[quote=引用 13 楼 wggfcusmq 的回复:] [quote=引用 12 楼 yupeigu 的回复:] [quote=引用 10 楼 wggfcusmq 的回复:] [quote=引用 9 楼 u012208913 的回复:] if @@rowcount=0 return 这句是表有数据往下执行,表不会删到只有0条加不加都一样 if exists(select top 1 SourceType from inserted where SourceType='采购订单') 这句这样就快很多
多谢了,但在触发器中加if @@rowcount=0 return的主要作用就是为了对这个表作0数据变动的时候,不用再执行触发器的逻辑。 @@rowcount=0是指最后一次操作所影响的数据行数,而不是表有没有数据。[/quote] 你这么一说,倒也有道理,相当于,先用一个查询看一下,是否还有数据,如果没有数据,就直接跳过,不再执行下面的update语句了。 不过其实下面的update语句,假如没有查询到记录,那么也不会进行update操作,因为: update = select 查询到数据 + if 有数据 修改 else 什么也不做 相比较而言,还是把if语句去掉,直接来个update语句,这样效率更高[/quote] 我有做过测试,比如下面。 create table table2 ( ID int not null identity(1,1) primary key, qty money not null default(0) ) go create trigger tu_table2 on table2 after update as --if @@rowcount=0 return select 1 go update table2 set qty=1 where 1=2 如果没有加if @@rowcount=0 return,那么在执行 update table2 set qty=1 where 1=2 也会执行select 1,但因为我所有的触发器都有加了if @@rowcount=0 return,所以我觉的我是不是可以不用if条件了。[/quote] 哦,是这样啊,那应该是的,因为你加了if @@rowcount=0 相当于没有记录受影响,所以也就诶必要在写if了[/quote] 嗯,是的。
LongRui888 2013-12-28
  • 打赏
  • 举报
回复
引用 13 楼 wggfcusmq 的回复:
[quote=引用 12 楼 yupeigu 的回复:] [quote=引用 10 楼 wggfcusmq 的回复:] [quote=引用 9 楼 u012208913 的回复:] if @@rowcount=0 return 这句是表有数据往下执行,表不会删到只有0条加不加都一样 if exists(select top 1 SourceType from inserted where SourceType='采购订单') 这句这样就快很多
多谢了,但在触发器中加if @@rowcount=0 return的主要作用就是为了对这个表作0数据变动的时候,不用再执行触发器的逻辑。 @@rowcount=0是指最后一次操作所影响的数据行数,而不是表有没有数据。[/quote] 你这么一说,倒也有道理,相当于,先用一个查询看一下,是否还有数据,如果没有数据,就直接跳过,不再执行下面的update语句了。 不过其实下面的update语句,假如没有查询到记录,那么也不会进行update操作,因为: update = select 查询到数据 + if 有数据 修改 else 什么也不做 相比较而言,还是把if语句去掉,直接来个update语句,这样效率更高[/quote] 我有做过测试,比如下面。 create table table2 ( ID int not null identity(1,1) primary key, qty money not null default(0) ) go create trigger tu_table2 on table2 after update as --if @@rowcount=0 return select 1 go update table2 set qty=1 where 1=2 如果没有加if @@rowcount=0 return,那么在执行 update table2 set qty=1 where 1=2 也会执行select 1,但因为我所有的触发器都有加了if @@rowcount=0 return,所以我觉的我是不是可以不用if条件了。[/quote] 哦,是这样啊,那应该是的,因为你加了if @@rowcount=0 相当于没有记录受影响,所以也就诶必要在写if了
  • 打赏
  • 举报
回复
引用 12 楼 yupeigu 的回复:
[quote=引用 10 楼 wggfcusmq 的回复:] [quote=引用 9 楼 u012208913 的回复:] if @@rowcount=0 return 这句是表有数据往下执行,表不会删到只有0条加不加都一样 if exists(select top 1 SourceType from inserted where SourceType='采购订单') 这句这样就快很多
多谢了,但在触发器中加if @@rowcount=0 return的主要作用就是为了对这个表作0数据变动的时候,不用再执行触发器的逻辑。 @@rowcount=0是指最后一次操作所影响的数据行数,而不是表有没有数据。[/quote] 你这么一说,倒也有道理,相当于,先用一个查询看一下,是否还有数据,如果没有数据,就直接跳过,不再执行下面的update语句了。 不过其实下面的update语句,假如没有查询到记录,那么也不会进行update操作,因为: update = select 查询到数据 + if 有数据 修改 else 什么也不做 相比较而言,还是把if语句去掉,直接来个update语句,这样效率更高[/quote] 我有做过测试,比如下面。 create table table2 ( ID int not null identity(1,1) primary key, qty money not null default(0) ) go create trigger tu_table2 on table2 after update as --if @@rowcount=0 return select 1 go update table2 set qty=1 where 1=2 如果没有加if @@rowcount=0 return,那么在执行 update table2 set qty=1 where 1=2 也会执行select 1,但因为我所有的触发器都有加了if @@rowcount=0 return,所以我觉的我是不是可以不用if条件了。
LongRui888 2013-12-28
  • 打赏
  • 举报
回复
引用 10 楼 wggfcusmq 的回复:
[quote=引用 9 楼 u012208913 的回复:] if @@rowcount=0 return 这句是表有数据往下执行,表不会删到只有0条加不加都一样 if exists(select top 1 SourceType from inserted where SourceType='采购订单') 这句这样就快很多
多谢了,但在触发器中加if @@rowcount=0 return的主要作用就是为了对这个表作0数据变动的时候,不用再执行触发器的逻辑。 @@rowcount=0是指最后一次操作所影响的数据行数,而不是表有没有数据。[/quote] 你这么一说,倒也有道理,相当于,先用一个查询看一下,是否还有数据,如果没有数据,就直接跳过,不再执行下面的update语句了。 不过其实下面的update语句,假如没有查询到记录,那么也不会进行update操作,因为: update = select 查询到数据 + if 有数据 修改 else 什么也不做 相比较而言,还是把if语句去掉,直接来个update语句,这样效率更高
  • 打赏
  • 举报
回复
引用 9 楼 u012208913 的回复:
if @@rowcount=0 return 这句是表有数据往下执行,表不会删到只有0条加不加都一样 if exists(select top 1 SourceType from inserted where SourceType='采购订单') 这句这样就快很多
多谢了,但在触发器中加if @@rowcount=0 return的主要作用就是为了对这个表作0数据变动的时候,不用再执行触发器的逻辑。 @@rowcount=0是指最后一次操作所影响的数据行数,而不是表有没有数据。
xiye_jfb 2013-12-28
  • 打赏
  • 举报
回复
if @@rowcount=0 return 这句是表有数据往下执行,表不会删到只有0条加不加都一样 if exists(select top 1 SourceType from inserted where SourceType='采购订单') 这句这样就快很多
LongRui888 2013-12-28
  • 打赏
  • 举报
回复
引用 7 楼 wggfcusmq 的回复:
[quote=引用 4 楼 yupeigu 的回复:] 哦,不用加的,因为你在update语句中加了条件: t2.SourceType='采购订单' 所以,经过这个条件过滤之后,只有满足要求的数据,才会被update
嗯,谢谢了,以前要加的原因就是,即使是0条件数据,也会触发器目标表的触发器,加了if条件,就不会有这种问题了。 现在发现这个if条件就是个麻烦啊,很多时候,if条件和后面的update条件不小心就写成不一样的了,结果就造成错误,我想还不如全删除掉if条件,看着也清爽。[/quote] 嗯 对的,这个if条件,其实就是根据实际情况,来设置,如果没必要,就可以不写,就像你说的,这样看起来就清爽多了
  • 打赏
  • 举报
回复
引用 4 楼 yupeigu 的回复:
哦,不用加的,因为你在update语句中加了条件: t2.SourceType='采购订单' 所以,经过这个条件过滤之后,只有满足要求的数据,才会被update
嗯,谢谢了,以前要加的原因就是,即使是0条件数据,也会触发器目标表的触发器,加了if条件,就不会有这种问题了。 现在发现这个if条件就是个麻烦啊,很多时候,if条件和后面的update条件不小心就写成不一样的了,结果就造成错误,我想还不如全删除掉if条件,看着也清爽。
LongRui888 2013-12-28
  • 打赏
  • 举报
回复
update语句,本质上也是一个select语句,先用条件,查询到数据,然后再更新,如果经过条件的过滤,没有查询到任何的数据,那么这个时候,就不会有update操作了
LongRui888 2013-12-28
  • 打赏
  • 举报
回复
引用 3 楼 wggfcusmq 的回复:
[quote=引用 2 楼 u012208913 的回复:] Update不需要了吧,没有数据就更新0条而已!
是的,我也是这么想的,但我看到系统中其他人都加了,所以想问问大家是不是还有别的什么原因。[/quote] 他是想多了,其实写的: if exists(select 1 from inserted where SourceType='采购订单') 和 update t1 set t1.price=t2.price from table 1,inserted t2 where t1.ID=t2.SourceID and t2.SourceType='采购订单' 是一个意思。
LongRui888 2013-12-28
  • 打赏
  • 举报
回复
哦,不用加的,因为你在update语句中加了条件: t2.SourceType='采购订单' 所以,经过这个条件过滤之后,只有满足要求的数据,才会被update
  • 打赏
  • 举报
回复
引用 2 楼 u012208913 的回复:
Update不需要了吧,没有数据就更新0条而已!
是的,我也是这么想的,但我看到系统中其他人都加了,所以想问问大家是不是还有别的什么原因。
xiye_jfb 2013-12-28
  • 打赏
  • 举报
回复
Update不需要了吧,没有数据就更新0条而已!
  • 打赏
  • 举报
回复
个人认为,就是如果不加if 条件,那么只要这个表的任何数据变动,都会触发table1表的update触发器,但如果加了if条件,就不会。 但因为我的所有触发器都加了if @@rowcount=0 return 所以table1表的触发器仅仅只是被触发了,但并不会执行任何sql,所以我个人认为这并不影响什么。 我是想除了这个外,还有没有其它原因必须要加if条件的,因为我看到很多人都有加了if条件,但我嫌加这个太麻烦了,因为现在系统中的触发器太多了,而且一不小心,这个if条件就有可能写错了。

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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