欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » SQLServer教程 » 正文

热门阅读

巧用instead触发器解决存储过程不能使用table数据集为参数的问题

创建时间:2011年12月27日 14:38  阅读次数:(5121)
分享到:
存储过程相信大家都已经很熟悉了,它是不能使用数据集为参数的,就是不能向它传递一个表数据。如果碰到这种情况,我们只能是利用游标循环表中的每行数据,在游标中调用存储过程了。

本章我们讲一下如何利用instead触发器来一次性处理数据集中所有的数据。

我们都知道,instead触发器会中断对表的操作(比如修改,新增,删除等),如果有创建了instead触发器,而该触发器中又未再次显式的对数据进行操作(修改,新增,删除),那么,这个动作就不会对该表起作用了。利用这一特性,我们可以使用它来解决存储过程接受数据集的问题。

通过示例来说明:
先创建一个存储过程usp_demo,该存储过程接受参数@a int与@b int,在存储过程中计算这两个参数的和并将结果插入到临时表#table:
create procedure usp_demo
@a int,
@b int
as
declare @c int 
set @c=@a+@b
insert into #table(ID) values (@c)

再创建临时表#table
create table #table
(
ID int
)

然后我要将数据集
select 1 as a,2 as b
union 
select 3 as a,10 as b
union 
select 4 as a,12 as b
插入到表#table中

方法一:通过存储过程usp_demo将测试数据插入到表#table中,处理方法应该是这样的。
declare @a int
declare @b int
declare re_cusor cursor for select 1 as a,2 as b
union 
select 3 as a,10 as b
union 
select 4 as a,12 as b

open re_cusor
fetch next from re_cusor into @a,@b
while @@fetch_status=0
begin
exec usp_demo @a,@b
fetch next from re_cusor into @a,@b
end

close re_cusor
deallocate re_cusor

上面方法固然实现了功能,但因为用到了游标,这是我们所不想的。下面我们利用instead触发器来实现同样的功能。

方法二:利用instead触发器将测试数据插入到表#table中
先创建一个表,该表的字段与存储过程的参数一样。
create table ut_demo
(
a int,
b int
)

然后为该表创建instead触发器
create trigger iti_ut_demo on ut_demo instead of insert
as
insert into #table(ID)
select a+b from inserted

这样,触发器iti_ut_demo即中断了对表ut_demo的操作,又往#table中插入了数据。我们将数据集
select 1 as a,2 as b
union 
select 3 as a,10 as b
union 
select 4 as a,12 as b
插入表#table中的方法为:
insert into ut_demo(a,b)
select 1 as a,2 as b
union 
select 3 as a,10 as b
union 
select 4 as a,12 as b

最后删除测试中用到的对象:
drop table #table
drop table ut_demo
drop procedure usp_demo


以上方法为个人经验,如有不妥之处望大家在评论中讨论。
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 68+60=? 的结果(结果是:128)
结  果: