declare @TotalNum int 
exec Select_Page 10,1,'sysobjects','id',' ','order by id asc ',@TotalNum out
select 记录总数=@TotalNum/*--结果:
(所影响的行数为 10 行)记录总数
----------- 
22(所影响的行数为 1 行)--*/

解决方案 »

  1.   

    另外注意一点在前台对存储过程的调用,不可能同时返回结果集和@TotalNum 的值,一次调用只能选择返回其中一种.
      

  2.   

    存储过程没有错.但是没有看出你的存储过程中,@i的有什么作用,要不要都影响结果啊.
    -------------------------------@i得作用是快速移动到@i>@previous得位置,然后把满足这个条件得记录得唯一值存到一个字符串里面,这样做是用来对符合条件的记录进行分页,取我们需要的页。我是参考这里做的:
    http://www.microsoft.com/china/community/Column/49.mspx
    --------------------------------------
    另外注意一点在前台对存储过程的调用,不可能同时返回结果集和@TotalNum 的值,一次调用只能选择返回其中一种.
    -------------------------------------
    我试过,可以同时返回结果集和@TotalNum,不知道是不是我哪里弄错了。哦,有一点我忘记说了,如果order by是对一个普通字段,可以获得我要的结果,是正常的。但是如果是对一个以nvarchar类型存储的日期字符串排序(order by convert(datetime, Register_Date) asc )就发生了我遇到的问题:返回了空结果集,但@TotalNum却是对的。写了很多,罗嗦了。抱歉。麻烦你了。如果太麻烦就不要为我弄了,多谢
      

  3.   

    我用ADO调用存储过程的,一直没办法在一次调用中同时得到记录集和返回参数的值(用的是2.8的版本)不知道楼主用什么方法调用的.@i的作用看明白了,不过,你用的是in的处理方法,效率最主要是这里不高,而不是前面的处理上.
      

  4.   

    CREATE PROCEDURE Select_Page
    @PageSize int, --页面大小
    @CurrPage int, --当前页号,从1开始
    @TableName nvarchar(100), --表名
    @UniqueField nvarchar(100), --一般为具有唯一值的关键字段,算法实现需要。注意:视该字段的类型需要适当修改代码。
    @Where nvarchar(1000), --搜索条件,例子: where fileld=value
    @OrderBy nvarchar(200), --排序字段,例子:order by name desc
    @TotalNum int output  --符合条件的记录总数  
    AS
    set nocount on
    declare @s nvarchar(4000)--得到符合搜索条件的记录总数,只是得到总数,不需要order by
    set @TotalNum = 0
    set @s = N'select @TotalNum=@TotalNum+1 from ' + @TableName + ' ' + @Where + ' ' + @OrderBy
    exec sp_executesql @s, N'@TotalNum int output',@TotalNum output--得到符合条件的记录
    if @CurrPage=1 --如果是第一页,直接用top就可以出到结果了
    begin
    set rowcount @PageSize
    exec(N'select * from ' + @TableName + ' ' + @Where + ' ' + @OrderBy)
    end
    else --否则,就要生成要查询的关键字列表
    begin
    declare @top1 int,@top2 int
    select @top1=@CurrPage*@PageSize
    ,@top2=(@CurrPage-1)*@PageSize
    ,@s='set rowcount @top1
    select ' + @UniqueField +' into #t from ' + @TableName + ' ' + @Where + ' ' + @OrderBy+'
    set rowcount @top2
    delete from #t
    select * from ' + @TableName + ' a
    where exists(
    select * from #t 
    where ' + @UniqueField +' = a.' + @UniqueField +')
    ' + @OrderBy
    exec sp_executesql @s
    ,N'@top1 int,@top2 int'
    ,@top1,@top2
    end
    set rowcount 0
    GO