触发器为什么只能更新其中一条记录

jacketzhou 2008-12-05 10:52:06
CREATE TRIGGER panlu ON dbo.TB_AnsiMatch
FOR INSERT,UPDATE
AS
declare @id int,@a varchar(10) ,@b varchar(50),@type varchar(50)
select @id=id,@a=a,@b=b,@type=type from inserted
if update(a) or update(b)
begin
if @h_jq+@a_jq<>''
begin
if @type='1'
begin
update table set c=@a+@b where id=@id
end
else
begin
update table set c=@a-@b where id=@id
end
end
end

table触发器
字段a跟b是同时更新,记录有很多是相同的,只是type类型不一样,当type=1时就相加,type=0就相减
问题是当有两条相同记录的时候,只会更新一条记录,不知道什么?
例如:
id a b c type
-----------------------
1 8 6 1
2 8 6 1
...


当同时更新上面两条记录的时候得出的结果是
id a b c type
-----------------------
1 8 6 14 1
2 8 6 1
...全文
326 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jacketzhou 2008-12-08
  • 打赏
  • 举报
回复
我明白楼上的写法,但我想用建立个游标循环的写法,因为中间操作有点复杂,循环inserted,得到每个ID号,然后进行判断
中国风 2008-12-08
  • 打赏
  • 举报
回复
@h_jq+@a_jq --沒有聲明變量

CREATE  TRIGGER panlu ON dbo.TB_AnsiMatch
FOR INSERT,UPDATE
AS
if not (update(a) or update(b))
return
update a
set c=i.a+case when i.Type=1 then i.b else -i.b end
from [table] a
inner join (select ID,Type,sum(a) a,sum(b) b from inserted group by ID,Type)i on a.ID=i.ID
jacketzhou 2008-12-08
  • 打赏
  • 举报
回复
declare @id int

select @id = min(id) from inserted
while @id is null
begin
--循环
select @id = min(id) from inserted where id > @id
end

明白意思了
但这个代码好像进入死循环了
shizheyangde 2008-12-06
  • 打赏
  • 举报
回复
“去掉 where id=@id ,和ID没有关系
这个去掉了是不是只会修改被触发的记录,不会修改整个表的数据”
去掉where触发整表的记录,存在where只触发被修改的记录
liubocy 2008-12-06
  • 打赏
  • 举报
回复
while @id is null --> while @id is not null
liubocy 2008-12-06
  • 打赏
  • 举报
回复
你就建立个游标咯,
或者如果id字段不重复的话,可以根据id字段来做个循环:

declare @id int

select @id = min(id) from inserted
while @id is null
begin
--循环
select @id = min(id) from inserted where id > @id
end
jacketzhou 2008-12-05
  • 打赏
  • 举报
回复
在你的代码中没有声明变量@h_jq和@a_jq
发表时没注意到

去掉 where id=@id ,和ID没有关系
这个去掉了是不是只会修改被触发的记录,不会修改整个表的数据
james-a 2008-12-05
  • 打赏
  • 举报
回复
在你的代码中没有声明变量@h_jq和@a_jq

CREATE TRIGGER test1 ON [dbo].[Table1]
FOR INSERT, UPDATE
AS
declare @a int ,@b int,@type int
select @a=a,@b=b,@type=type from inserted
if update(a) or update(b)
begin
if @type='1'
begin
update table1 set c=@a+@b
end
else
begin
update table1 set c=@a-@b
end
end

去掉 where id=@id ,和ID没有关系
jacketzhou 2008-12-05
  • 打赏
  • 举报
回复
明白一点了,这只是提出的一个例子,由于在操作中字段c要的结果不是相加跟相减,要复杂一点,我想知道如何循环达到更新每一条达到要求的记录。
先记上给两位分

update A set c=CASE WHEN type =1 THEN a+b ELSE a-b END FROM [Table] A INNER JOIN Inserted B ON a.id=b.id
这个句子没怎么看懂
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chuifengde 的回复:]
SQL codeCREATE TRIGGER panlu ON dbo.TB_AnsiMatch
FOR UPDATE
AS
if update(a) or update(b)
update A set c=CASE WHEN type =1 THEN a+b ELSE a-b END FROM [Table] A INNER JOIN Inserted B ON a.id=b.id
[/Quote]

顶这个。

另外按照你的写法,肯定只能更新一行,你的写法上需要加一个循环来进行。
chuifengde 2008-12-05
  • 打赏
  • 举报
回复
CREATE  TRIGGER panlu ON dbo.TB_AnsiMatch 
FOR UPDATE
AS
if update(a) or update(b)
update A set c=CASE WHEN type =1 THEN a+b ELSE a-b END FROM [Table] A INNER JOIN Inserted B ON a.id=b.id
  • 打赏
  • 举报
回复
select @id=id,@a=a,@b=b,@type=type from inserted

这个取的是inserted临时表中最后一行的值

where id=@id 你这个id是唯一的,当然只会更新一行,改成type=@type

34,594

社区成员

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

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