Sql Server 通用分页

/*  
过程说明:简单分页程序(要么分页,要么统计)  
编 写 人:
编写时间:
*/
  
CREATE   PROCEDURE  Page  
@tblName   varchar ( 255 ),  --  表名  
@fldName   varchar ( 255 ),  --  字段名  
@PageSize   int   =   10 --  页尺寸  
@PageIndex   int   =   1 --  页码  
@IsCount   bit   =   0 --  返回记录总数, 非 0 值则返回  
@OrderType   bit   =   0 --  设置排序类型, 非 0 值则降序  
@strWhere   varchar ( 1000 =   ''  ,  --  查询条件 (注意: 不要加 where)  
@FieldsList   varchar ( 255 --  字段列表(要选出的字段)  
AS   
 
declare   @strSQL   varchar ( 1000 ),  --  主语句  
@strTmp   varchar ( 300 ),  --  临时变量  
@strOrder   varchar ( 400 --  排序类型  
set   @strTmp   =   ''   
set   @strOrder   =   ''   
 
-- 只统计总记录数  
if   @IsCount   !=   0   
begin   
if   @strWhere   !=   ''   
set   @strTmp   =  "  where  ("  +   @strWhere   +  ")"  
set   @strSQL   =  " select   count ( * as  Total  from   [ " + @tblName + " ] +   @strTmp   
end   
-- 不统计总记录,分页(查询表中所有记录)  
else   
begin   
-- 如果是第一页  
if   @PageIndex   =   1   
begin   
-- 排序  
if   @OrderType   !=   0   
set   @strOrder   =  "  order   by   [ " + @fldName +" ]   desc "  
else   
set   @strOrder   =  "  order   by   [ " + @fldName +" ]   asc "  
-- 条件  
if   @strWhere   !=   ''   
set   @strTmp   =  "  where  ("  +   @strWhere   +  ")"  
 
set   @strSQL   =  " select   top  "  +   str ( @PageSize +  " "  + @FieldsList   +  "  from   [ "  
+ @tblName + "
] +   @strTmp   +  " "  +   @strOrder   
end   
-- 如果不是第一页  
else   
begin   
-- 排序  
if   @OrderType   !=   0   
begin   
set   @strTmp   =  " < ( select   min "  
set   @strOrder   =  "  order   by   [ " + @fldName +" ]   desc "  
end   
else   
begin   
set   @strTmp   =  " > ( select   max "  
set   @strOrder   =  "  order   by   [ " + @fldName +" ]   asc "  
end   
set   @strSQL   =  " select   top  "  +   str ( @PageSize +  " "  +   @FieldsList   +  "  from   [ "  
+ @tblName + "
]   where   [ " + @fldName + " ] +   @strTmp   +  "( [ "  
+ @fldName + "
] from  ( select   top  "  +   str (( @PageIndex - 1 ) * @PageSize +  "  [ "  
+ @fldName + "
]   from   [ " + @tblName + " ] +   @strOrder   +  ")  as  tblTmp)"  
+   @strOrder   
-- 条件  
if   @strWhere   !=   ''   
set   @strSQL   =  " select   top  "  +   str ( @PageSize +  " "  +   @FieldsList   +  "  from   [ "  
+ @tblName + "
]   where   [ " + @fldName + " ] +   @strTmp   +  "( [ "  
+ @fldName + "
] from  ( select   top  "  +   str (( @PageIndex - 1 ) * @PageSize +  "  [ "  
+ @fldName + "
]   from   [ " + @tblName + " ]   where  ("  +   @strWhere   +  ") "  
+   @strOrder   +  ")  as  tblTmp)  and  ("  +   @strWhere   +  ") "  +   @strOrder   
end   
end   
exec  ( @strSQL
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/* 分页思想:比如你要每页获取10条记录,当你显示第5页的记录时, 也就是选取第40条至50条的记录.首先应该从所有的记录集中选取 50条记录,同时进行倒序,再从中选10条,就完成工作了。 下面是一个具体的例子,从Northwind的Orders表中选取OrderID大于@OrderID的记录集, 分10条每页显示. */ --有查询条件分页存储过程 create procedure dbo.Products_GetByPaging @PageSize int, --每页的记录数量,比如10条,传参数时就是10 @CurrentPage int --第N页,比如第5页,传参数就是5 as declare @PageCount int --可分页的数量(总共能分多少页) declare @RowsCount int --符合查询条伯的记录行总数(总共有多少行记录) declare @LastRows int --整除后余下来的记录数 declare @SelectRowsCount int --要选择的行数(每页显示多少行) set @RowsCount=(select count(*) from dbo.Orders) -- 获取总共有多少行 set @PageCount=@RowsCount/@PageSize --看下能分多少页(获取总共能分多少页) set @LastRows=@RowsCount%@PageSize --是否还有余下的记录 set @SelectRowsCount=@PageSize --给要选取的行数赋值,如参数是10,就是每页10条记录 if(@LastRows>0)--当整除后还剩的记录数,比如总有95条记录符合,那就可以分10页,最后一页是5条记录 begin set @PageCount=@PageCount+1 --如果不能整除时要多加一页 if(@CurrentPage>=@PageCount) --如果选择的是最后一页时 set @SelectRowsCount=@LastRows --比如95条记录,第10页只能是5条记录 end declare @SelectStr varchar(5000) -- select top 10 * from (select top 20 * from (select * from orders where orderid>orderid as t1 order by orderid asc) as t2 order by orderid desc set @SelectStr='select top '+ Convert(nvarchar(10),@SelectRowsCount)+' * from (select top '+Convert(nvarchar(10),(@CurrentPage)*@PageSize)+' * from (select * from dbo.Orders) as t1 order by OrderID asc) as t2 order by OrderID desc' exec(@SelectStr) drop proc Products_GetByPaging

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值