与这个问题具有相同性质的其他描述还包括:
1、如何在存储过程中检索动态SQL语句的执行结果?
2、存储过程中如何根据另一个存储过程的执行结果选择执行流程?
3、存储过程中如何根据动态SQL语句的查询结果更改执行流程?
4、如何实现类似select * from (EXEC proedure_name @parameters_var)as datesource where ...的功能?
一个存储过程A使用另一个存储过程B的名字(或一段SQL语句或一个不确定的表名,字段名)作为参数,如何在不改动存储过程B的情况下,对存储过程B的执行结果记录集进行过滤/更改,再将过滤/更改后的结果集返回给存储过程A 的调用者?
上面这些问题都有一个共同点,那就是都希望对存储过程(或动态SQL语句)的执行结果进行再处理,但是标准的SQL语句只能处理数据表,而一个存储过程(或动态SQL语句)的执行结果虽然是记录集,但它们本身不能当做数据表来处理。这样就大大限制了存储过程(或动态SQL语句)的应用范围,它们只能作为将记录集返回给应用程序前的最后一个处理层。如果我们可以像使用普通的数据表那样使用存储过程(或动态SQL语句)该多好。
处理流程如下:
1、创建一个临时表#temp,表结构与目标存储过程procedure_name的返回结果集兼容(兼容即可,不必相同)
create table #temp(ID int IDENTITY (1,1) not null,
。。。)
2、执行存储过程并将存储过程的返回结果集插入临时表
insert into #temp EXEC procedure_name @parameters_var
3、现在可以使用(过滤、更改或检索)#temp了
if exists(select * from #temp)
begin
--执行分支1
end
else
begin
--执行分支2
end
4、最后清除临时表
drop table #temp
对于动态SQL语句,只要将第二步改为
insert into #temp EXEC dbo.sp_executesql @querystring_var
即可。
网友评论