存储过程相信大家都已经很熟悉了,它是不能使用数据集为参数的,就是不能向它传递一个表数据。如果碰到这种情况,我们只能是利用游标循环表中的每行数据,在游标中调用存储过程了。
本章我们讲一下如何利用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
以上方法为个人经验,如有不妥之处望大家在评论中讨论。