sp_cursoropen返回空结果集导致获取不到sp_cursorfetch数据集解决办法
今天修改一个asp程序,使用了存储过程,存储过程中使用sp_cursoropen/sp_cursorfetch来获取构造的sql语句获取分页数据,发现总记录数能获取到,但是就是无法获取到返回的记录集合。在SQL Server Management Studio执行存储过程,sql为asp输出的sql语句,发现尽然出现了2个结果集,一个是一条记录也没有的,另外一个是有结果的,如下图所示
结果asp的adodb.recordset获取的数据集合是第一个的空结果集合,而不是有数据的结果集合。第一个空结果集合是sp_cursoropen产生的,翻墙谷歌了下没有相关资料说如何去掉这个空结果集合(可能英语烂输入的英文不对,O(∩_∩)O哈哈~),第二才是sp_cursorfetch获取到的分页数据。
但是奇特的是,相同的asp程序和存储过程,在window2003+MSSQLServer2000的服务器跑(存储过程在查询管理器里面执行也是存在2个结果集合),asp的adodb.recordset获取到的是第二个有数据的,但是在win7+MSSQLServer2008上跑获取到的是第一个空结果结合的,我日。。
解决办法就是判断下获取的结果集合是否为空的,空的话调用adodb.recordset NextRecordset方法获取第二个结果集合。
最后贴下执行sql语句获取分页数据的存储过程和asp执行存储过程获取数据的asp代码
/****** Object: Stored Procedure dbo.p_splitpage ******/ CREATE procedure p_splitpage @sql nvarchar(4000),--要执行的sql语句 @currentpage int=2, --要显示的页码 @pagesize int=10,--每页的大小 @recordcount int=0 output,--记录数 @pagecount int=0 output--总页数 as set nocount on declare @p1 int exec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount output set @recordcount=@pagecount set @pagecount=ceiling(1.0*@pagecount/@pagesize) set @currentpage=(@currentpage-1)*@pagesize+1 --select @recordcount recordcount ,@pagecount pagecount,@currentpage currentpage exec sp_cursorfetch @p1,16,@currentpage,@pagesize exec sp_cursorclose @p1 set nocount off GO
asp代码
'高效通用的翻页函数,函数返回一个记录集对像 Function GetData(Sql,Conn,Cur_page,P_size,R_Count,P_Count) dim rs,Cmd Set Cmd = Server.CreateObject("ADODB.Command") Cmd.ActiveConnection=Conn Cmd.CommandType=4 'adCmdStoredProc Cmd.prepared=true '保存编译 Cmd.CommandText="p_splitpage" '存储过程 名称 '设置参数 Cmd.Parameters.Append Cmd.CreateParameter("@sql",200,1,500,Sql) Cmd.Parameters.Append Cmd.CreateParameter("@Current_Page",3,1,4,Cur_page) Cmd.Parameters.Append Cmd.CreateParameter("@pagesize",3,1,4,P_size) Cmd.Parameters.Append Cmd.CreateParameter("@recordcount",3,2) Cmd.Parameters.Append Cmd.CreateParameter("@pagecount",3,2) 'set rs=cmd.execute '开始执行 set rs=server.CreateObject("adodb.recordset") rs.CursorType =3 rs.LockType =3 rs.CursorLocation =3 set rs.Source =cmd rs.open R_Count=Cmd("@recordcount") P_Count=Cmd("@pagecount") '关键。。。不懂搞毛sqlserver2000+win2003直接获取的第二个表。win7+sqlserver2008得到的是第一个空的结果集合 if rs.eof or rs.bof then set rs=rs.nextrecordset set GetData=rs End Function
加支付宝好友偷能量挖...
原创文章,转载请注明出处:sp_cursoropen返回空结果集导致获取不到sp_cursorfetch数据集解决办法