SQL Server对结果集及游标的使用
一、对结果集使用的解决办法
如何在存储过程中使用另一个存储过程的结果集,或者对动态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