建议使用OUTPUT游标参数
OUTPUT游标参数用来将存储过程的局部游标传递回调用批处理、存储过程或触发器。
比如:use pubs
IF EXISTS(SELECT name FROM sysobjects
    WHERE name='titles_cursor' and type='P')
DROP PROCEDURE title_cursor
GO
CREATE PROCEDURE titles_cursor @titles_cursor CURSOR VARYING OUTPUT
AS
SET @titles_cursor=CURSOR
FORWARD_ONLY STATIC FOR
SELECT * FROM titles
OPEN @titles_cursor
GO
接下来,着性一个批处理,声明一个局部游标变量,执行上述过程以将游标赋给局部变量
然后从该游标提取行。
use pubs
go
declare @mycursor cursor
exec titles_cursor @titles_cursor=@mycursor output
while(@@fetch_status=0)
begin
   fetch next from @mycursor
end
close @mycursor
deallocate @mycursor
go

解决方案 »

  1.   

    1.存储过程的返回参数不能是表类型
      这是联机帮助上的原文
      参数的数据类型。除 table 之外的其他所有数据类型均可以用作存储过程的参数。但是,cursor 数据类型只能用于 OUTPUT 参数。如果指定 cursor 数据类型,则还必须指定 VARYING 和 OUTPUT 关键字。有关 SQL Server 提供的数据类型及其语法的更多信息,请参见数据类型。 
      

  2.   


    2.根据处理要求,可以用输出游标,参考1楼的帖出的帮助,也可以参考联机帮助上create procdure部分
      也可以直接返回表结果集,类似这样:
    create procedure sp_GetAAVolunteerListTmp
    @AdminID char(10),              
            @ActionType char(10),
            @StartDate datetime, 
            @EndDate datetime
    as
    begin
    set nocount on
    declare @table table(ID varchar(100),
         GroupName varchar(100),
         GroupID varchar(100),
         JoinInDate varchar(100),
         ApproveDate varchar(100),
         Name varchar(100),
         Creator varchar(100),
         VolunteerID varchar(100),
         PrimaryEmail varchar(100),
         CountyName varchar(100),
         UserName varchar(100),
         ReceivableCode varchar(100),
         LastSign varchar(100),
         LastProfile varchar(100),
         LastPass varchar(100))--   ....处理过程
    select * from @table
    end
    go--调用
    exec sp_GetAAVolunteerListTmp '1','1','2004-1-1','2004-1-1'
      

  3.   

    zjcxc(邹建)  说的对,直接返回结果集!