XuGang

记录一个程序员的成长

 

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

参考 MSDN 资源:http://msdn.microsoft.com/zh-cn/library/ms180169.aspx

(完)

 

posted on 2012-10-22 17:08  钢钢  阅读(3928)  评论(0编辑  收藏  举报

导航