数据库存储过程实现高效分页

来源:互联网 发布:node.js express 编辑:程序博客网 时间:2024/06/05 15:04
Create PROCEDURE  Paging
@TableName Nvarchar(4000), --要显示的表、视图(大视图最好不要用)、或是SQL语句
@FieldName nvarchar(4000) = '*', --要显示的字段列表,所有字段是* 大视图最好不要用*
@PageSize int, --每页显示的记录个数(每页条数小于1则修正成10)
@PageIndex int=1, --要显示那一页的记录(当前页小于1或自动修正为1)
@Where  nvarchar(2000) = '1=1', --查询条件

@OrderBy nvarchar(2000), --排序字段,最好是索引字段

@OrderByType bit=1,--排序方式默认1按DESC排序0按ASC排序

@PageCount int = 1 output, --返回分页后的总页数
@RecordCount int =0 output --返回查询到的记录数

AS

SET NOCOUNT ON

BEGIN
Declare @SelectSql nvarchar(4000) --声明一个查询语句
if @PageSize < 1 set @PageSize = 10--如果小每页大小小于1则设置为10
set @SelectSql = ' select @RecordCount = count(0) from ' + @TableName + ' where ' + @Where
exec sp_executesql @SelectSql ,N'@RecordCount int out ',@RecordCount out
--计算@PageCount的值
if @RecordCount <= @PageSize
set @PageCount = 1
else if @RecordCount % @PageSize = 0
set @PageCount = (@RecordCount / @PageSize )
else
set @PageCount = (@RecordCount / @PageSize ) + 1
--检查@PageIndex的值
if @PageIndex> @PageCount
set @PageIndex= @PageCount
if @PageIndex < 1
set @PageIndex = 1

--set @SelectSql = 'select * '+@FieldName +' from (' +

if @orderByType=1

set @SelectSql = 'select *  from (' +
'select row_number() over  ( order by ' + @OrderBy + ' DESC)  RowID ,' + @FieldName +
' from ' + @TableName + ' where ' + @Where +
') a where a.RowID between ' + cast((@PageIndex -1) * @pageSize+1 as varchar(128)) +

' and  ' + cast((@PageIndex * @pageSize) as varchar(128))

else

set @SelectSql = 'select *  from (' +
'select row_number() over  ( order by ' + @OrderBy + ' ASC)  RowID ,' + @FieldName +
' from ' + @TableName + ' where ' + @Where +
') a where a.RowID between ' + cast((@PageIndex -1) * @pageSize+1 as varchar(128)) +
' and  ' + cast((@PageIndex * @pageSize) as varchar(128))

exec sp_executesql @SelectSql

select @PageCount,@RecordCount

END
SET NOCOUNT OFF

高效分页

0 0
原创粉丝点击