一、对结果集使用的解决办法
如何在存储过程中使用另一个存储过程的结果集,或者对动态SQL语句的执行结果再次使用,可以使用下面这样的语句:
INSERT INTO table_name EXEC procedure_name @parameters_var
使用代码如下:
--1 创建一个临时表#tmp,表结构与目标存储过程procedure_name的返回结果集兼容(兼容即可,不必相同)。 create table #tmp( [columns_list] ) --2.1 执行存储过程,并将存储过程的返回结果集插入临时表。 insert into #tmp exec procedure_name @parameters_var --2.2 对于动态sql语句的执行如下(如果直接通过exec执行动态sql语句,sql语句有4k的长度限制。) insert into #tmp exec dbo.sp_executesql @querystring_var --3 现在可以使用(过滤,更改或检索)#tmp了。 if exists(select * from #tmp) begin --执行分支1 end else begin --执行分支2 end --4 最后清除临时表。 drop table #tmp
思路2:创建一个函数返回需要的查询结果集,然后在存储过程中当做table使用即可。
二、对游标的使用尝试
下面是使用 SQL Server 游标的一个示例。首先,创建测试环境:
create table #tmp( ID int ,UserName varchar(12) ) GO insert into #tmp values(1,'aaaa'); insert into #tmp values(2,'bbbb'); insert into #tmp values(3,'aabb'); insert into #tmp values(4,'bbaa'); GO select * from #tmp GO
使用代码如下:
alter procedure Demo as begin declare @tmpID int,@tmpName varchar(12); begin try -- 注意:有order by不能对select 语句使用括号 declare cr cursor for select ID,UserName from #tmp order by ID; open cr; fetch next from cr into @tmpID,@tmpName; -- @@fetch_status 返回当前打开的游标的 FETCH 语句的状态 while(@@fetch_status=0) begin print convert(varchar(6),@tmpID) + @tmpName; fetch next from cr into @tmpID,@tmpName; --读取下一条数据 if(@tmpName = 'aabb') goto userGO; end; userGO: print '自定义GOTO语句跳转'; close cr; -- 关闭游标 deallocate cr; -- 释放游标 end try begin catch close cr; -- 关闭游标 deallocate cr; -- 释放游标 print '异常处理!' end catch end; exec Demo 本文转自钢钢博客园博客,原文链接:http://www.cnblogs.com/xugang/archive/2012/10/22/2734218.html,如需转载请自行联系原作者