SERVET分页的储存过程

use MySchool
go
--检查是否存在储存过程PROC_PAGER,存在则删除
IF EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME='PROC_PAGER')
 DROP PROCEDURE PROC_PAGER
go
--创建储存过程PROC_PAGER
CREATE PROCEDURE PROC_PAGER
 @tableName nvarchar(64),   --表名
 @pkey nvarchar(32),--主键
 @PageCount bigint output,--总页数
 @Pages bigint output, --当前页
 @condition nvarchar(256)='1=1', --分页条件(比如:Name='Jack' and Age=18)
 @orderField nvarchar(128)=@pKey, --排序字段(比如:SID,Name)
 @pageSize int = 10,   --页大小
 @pageIndex int = 1   --页号
as
 BEGIN
 declare @SQLPAGER NVARCHAR(4000)
 set @SQLPAGER = 'SELECT TOP {PAGE_SIZE} * FROM {TABLE_NAME}
     WHERE {PKEY} NOT IN
     (
      SELECT TOP {PASS_COUNT} {PKEY}
      FROM {TABLE_NAME}
      WHERE {CONDITION}
      ORDER BY {ORDER_FIELD}
     )
     AND {CONDITION}
     ORDER BY {ORDER_FIELD}'

--此处开始替换@SQLPAGER变量中的参数
select @SQLPAGER = replace(@SQLPAGER,'{TABLE_NAME}',@tableName)
select @SQLPAGER = replace(@SQLPAGER,'{PKEY}',@pKey)
select @SQLPAGER = replace(@SQLPAGER,'{PASS_COUNT}',@PageSize)
select @SQLPAGER = replace(@SQLPAGER,'{ORDER_FIELD}',@orderField)
select @SQLPAGER = replace(@SQLPAGER,'{PAGE_SIZE}',@PageSize)
select @SQLPAGER = replace(@SQLPAGER,'{CONDITION}',@Condition)

--计算总页数
declare @sql nvarchar(4000)
set @sql = N'select @cnt=count(*) from {TABLE_NAME} where {CONDITION}'
select @SQL = replace(@SQL,'{TABLE_NAME}',@tableName)
select @SQL = replace(@SQL,'{CONDITION}',@Condition)

exec sp_executesql @sql,N'@cnt bigint output',@PageCount output
set @PageCount = (@PageCount-1)/@pageSize + 1
--select @PageCount
set @pages = @pageIndex
 
 --PRINT @SQLPAGER     --显示拼接的分页SQL
 EXEC SP_EXECUTESQL @SQLPAGER --动态执行拼接的分页SQL语句
END
go

declare @pages int,@pageIndex int
EXEC PROC_PAGER STUDENT,STUDENTNO,@pages output,@pageIndex output,@pageSize=3
print '总页数为:' + convert(nvarchar(30),@pages)
print  '当前页数为:' + convert(nvarchar(30),@pageIndex)

posted on 2011-07-20 14:35  Fancy_hui  阅读(108)  评论(0)    收藏  举报

导航