触发器里使用游标 有做过的兄弟姐妹进来看。

ljb2000 2003-09-03 01:17:29
我想解决的是在某个表里写个UPDATE触发器
当其被UPDATE时往其对应的目的表里写数据
每条记录被UPDATE时同时将deleted和inserted里的记录插入目的表
但是当多条记录被UPDATE时
SQLSERVER会先把所有的deleted里的记录先插入目的表
再把所有的inserted里的记录插入目标表
根据需求不可以这样
必须逐条UPDATE
即deleted后inserted再进行下一条的deleted和inserted
我想到了使用游标
不过我从没用过
看帮助也搞不清楚
哪位老大能帮忙给个例子啊?
我先谢过了!!!
...全文
44 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljb2000 2003-09-04
  • 打赏
  • 举报
回复
谢谢大家的帮助,问题已经解决了。

针对不同的表有两种解决方式:
1.没有唯一不可变字段的情况下,可以使用txlicenhe(马可@李),Sorder(剑客)两位朋友的方法
2.有唯一且不可变字段的情况下,可以使用 zjcxc(邹建)朋友的方法,只是不需要建两个@id变量,有一个就够了。
pengdali 2003-09-03
  • 打赏
  • 举报
回复
需要游标吗?我看不需要。
create trigger 名 on 表
for update
as
insert 目标表 (列1,列2) select 列1,列2 from inserted
w_rose 2003-09-03
  • 打赏
  • 举报
回复
Foxpro中毒了,没有明白真正的数据库是怎么考虑“记录的顺序”的!
zhbname 2003-09-03
  • 打赏
  • 举报
回复
如果你只是insert修改的信息,那么就应该这样写了.
declare ins_cur cursor local for Select value from inserted,表名
where 表名.id=inserted.id

declare del_cur cursor local for Select value from deleted,表名
where 表名.id=inserted.id
Sorder 2003-09-03
  • 打赏
  • 举报
回复
create trigger trtablename_upd on tablename
For update
As
declare @ins_value as valuetype ,@del_value as valuetype

declare ins_cur cursor local for Select value from inserted
declare del_cur cursor local for Select value from deleted
open ins_cur
fetch next from ins into @ins_value
open del_cur
fetch next from del into @del_value
while @@fetch_status = 0 begin
//处理
fetch next from ins into @ins_value
fetch next from del into @del_value
end
close ins_cur
close del_cur
deallocate ins_cur
deallocate del_cur
Alexs 2003-09-03
  • 打赏
  • 举报
回复
学习,触发器也用游标
zhouzdsoft 2003-09-03
  • 打赏
  • 举报
回复
set @@rowcunt=1
避免多条同时触发
zjcxc 元老 2003-09-03
  • 打赏
  • 举报
回复
举个简单的例子:
create trigger t_update
for update
as
declare @id1 int,@id2 int --被更新前/后的主键

--定义游标
declare c_i cursor for select id from inserted
declare c_d cursor for select id from deleted

--打开游标
open c_i
open c_d

--从游标中循环取数,并进行相关的处理
fetch next from c_i into @id1
while @@fetch_status=0
begin
fetch next from c_d into @id2
update 表 set id=id1 where id=id2 --数据处理语句
fetch next from c_i into @id1
fetch next from c_d into @id2
end

--关闭游标
close c_i
close c_d

--释放游标
deallocate c_i
deallocate c_d
go

yujohny 2003-09-03
  • 打赏
  • 举报
回复
txlicenhe(马可@李) 的代码就可以达到你要求了
txlicenhe 2003-09-03
  • 打赏
  • 举报
回复
create trigger yourTrigger on yourTable
For update
As
declare ins cursor for Select * from inserted
declare del cursor for Select * from deleted
open ins
fetch next from ins into @...
open del
fetch next from del into @...
while @@fetch_status = 0
begin
处理语句
fetch next from ins into @...
fetch next from del into ...
end
close ins
deallocate ins
deallocate del
txlicenhe 2003-09-03
  • 打赏
  • 举报
回复
create trigger yourTrigger on yourTable
For update
As
declare ins cursor for Select * from inserted
declare del cursor for Select * from deleted
open ins
fetch next from ins into @...
open del
fetch next from del into @...
while @@fetch_status = 0
begin
处理语句
fetch next from ins into @...
fetch next from del into ...
end
close ins
deallocate ins
deallocate del
yoki 2003-09-03
  • 打赏
  • 举报
回复
为什么要一条一条的插入呢?
在插入的语句后面加上条件就应该可以过滤

34,576

社区成员

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

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