set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
goALTER Proc [dbo].[Proc_PageRecordByPageNo]
    @PageSize int=15 , --每页显示的记录数
    @PageCurrent int=1 , --当前要显示的页号
    @FdName varchar(100)='' , --主键名或者标识列名
    @SelectStr varchar(2000)='', --select子句,不包含select关键字,如:*或者Id,UserId,UserName等。
    @FromStr varchar(1000)='', --from子句,不包含from关键子,如:myTable或者myTable,yourTable
    @WhereStr varchar(2000)='', --Where子句,不包含where关键字,如空的,或者 id>2 等
    @OrderByStr varchar(1000)='', --order by 子句,不包含order by 子句 ,如id desc,UserId asc 等
@IsByPageNumber int=0, --当PageCurrent为页号时,为1;其它按PageCurrent为起始记录号
    @CountRows int=0 output, --返回记录总数
    @CountPage int=0 output --返回总页数
as
--定义局部变量
declare @Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
declare @OrderBySqls varchar(1000) --order by 子句
declare @WhereSqls varchar(2000) --where 子句
declare @Sqls nvarchar(4000) --最终组合成的Sqls语句
declare @TmpStr varchar(2000) --临时
----------------------------
--处理排序字符串
if @OrderByStr <> ''
    set @OrderBySqls = ' order by '+@OrderByStr
else
    set @OrderBySqls = ''
----------------------------
--处理条件字符串
if @WhereStr <> ''
    set @WhereSqls = ' where ('+@WhereStr+')' 
else
    set @WhereSqls = ''
----------------------------
--临时保存条件字符串
set @TmpStr = @WhereSqls
----------------------------
--如果每页显示记录数为0,取所有记录
if @PageSize=0
begin
exec('select '+ @SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls)
    goto LabelResAll
end
----------------------------
--如果显示第一页,可以直接用top来完成
if @PageCurrent=1 
begin
    select @Id1=cast(@PageSize as varchar(20))
    exec('select top '+@Id1+' '+@SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls)
    goto LabelRes
end
----------------------------
--@IsByPageNumber为1时,按页号检索;其它情况按记录号处理
if @IsByPageNumber=1
select @Id1=cast(@PageSize as varchar(20))
      ,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20))
else
select @Id1=cast(@PageSize as varchar(20))
      ,@Id2=cast(@PageCurrent as varchar(20))
----------------------------
--重新构造条件
if @WhereSqls <> ''
    set @WhereSqls = @WhereSqls + ' and (' + @FdName+' not in(select top '+@Id2+' '+@FdName+' from '+@FromStr+@WhereSqls+@OrderBySqls+'))'
else
    set @WhereSqls = ' where ' + @FdName+' not in(select top '+@Id2+' '+@FdName+' from '+@FromStr+@WhereSqls+@OrderBySqls+')'
----------------------------
--构造查询语句,执行查询
set @Sqls = 'select top '+@Id1+ ' '+ @SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls
exec (@Sqls)
----------------------------
LabelRes:
--返回总记录数
set @Sqls = 'select @a=count(1)  from '+@FromStr+@TmpStr
exec sp_executesql @sqls,N'@a int output',@CountRows output 
----------------------------
--返回总页数
if @CountRows <= @PageSize
set @CountPage = 1
else
begin
set @CountPage = @CountRows/@PageSize
if (@CountRows%@PageSize) > 0
    set @CountPage = @CountPage + 1
end
----------------------------
LabelResAll:
--无其它操作,直接返回
return是个分面的过程,但要会.net的知识,我不会
要转找在oracle 下可以用的分页过程
或另写一个也可以