ALTER procedure PageIndex
@PageSize INT = 0, --每一页有多少条数据
@PageIndex INT = 1, --当前需要查询的为第几页
@OrderBy NVARCHAR(30) = NULL, --排序字段
@Desc NVARCHAR(10) = 'DESC', --排序规则(升序/降序)
@Condition NVARCHAR(100) = NULL --业务需求条件
as
DECLARE @DataCount INT --数据总数
DECLARE @PageCount INT --总页数
DECLARE @GetCount INT --数据查询总数
DECLARE @FactCount INT --实际提取数据条数
DECLARE @ExeSql NVARCHAR(2000)
DECLARE @DataSql NVARCHAR(1000)
SELECT @DataCount = count(*) FROM Test
/**********************************************************************************
以下内容不需修改
**********************************************************************************/
SET @PageCount = dbo.GetPageCount(@DataCount, @PageSize)
SET @FactCount = dbo.GetFactCount(@DataCount, @PageSize, @PageIndex)
SET @GetCount = (@PageSize * dbo.GetPageIndex(@PageCount, @PageIndex)) - (@PageSize * @PageCount - @DataCount)
/*********************************************************************************/
IF (@PageIndex <= @PageCount)
BEGIN
--获取供筛选的数据
--根据所以筛选条件查询出相应的数据
SET @DataSql = 'SELECT TOP ' + convert(NVARCHAR(10),@GetCount) + ' * FROM Test'
/**********************************************************************************
以下内容不需修改
**********************************************************************************/
SET @DataSql = @DataSql + dbo.GetOrderBy(@OrderBy, @Desc, 1)
/*********************************************************************************/
--在查询出来的数据中进行分页截取、排序处理
SET @ExeSql ='SELECT TOP ' + convert(NVARCHAR(10),@FactCount) + ' * FROM (' + @DataSql + ') AS Tab1'
/**********************************************************************************
以下内容不需修改
**********************************************************************************/
SET @ExeSql = @ExeSql + dbo.GetOrderBy(@OrderBy, @Desc, 2)
/*********************************************************************************/
Execute (@ExeSql)
END
ELSE
BEGIN
PRINT '您输入的页码无效。'
END
RETURN
GO
exec PageIndex 7,5,'tid','deSC'
--获取排序条件
ALTER FUNCTION GetOrderBy(@orby NVARCHAR(30), @desc NVARCHAR(10), @type INT)
returns NVARCHAR(1000)
AS
BEGIN
DECLARE @StrSql NVARCHAR(1000)
SET @StrSql = ''
IF (@type = 1)--判断是哪种类型
BEGIN
IF (@orby IS NOT NULL)
BEGIN
IF (@desc = 'DESC')
BEGIN
SET @StrSql = ' ORDER BY ' + convert(nvarchar(100), @orby) + ' ASC'
END
ELSE
BEGIN
SET @StrSql = ' ORDER BY ' + convert(nvarchar(100), @orby) + ' DESC'
END
END
END
ELSE IF (@type = 2)
BEGIN
IF (@orby IS NOT NULL)
BEGIN
IF (@desc = 'DESC')
BEGIN
SET @StrSql = ' ORDER BY ' + convert(nvarchar(100), @orby) + ' DESC'
END
ELSE
BEGIN
SET @StrSql = ' ORDER BY ' + convert(nvarchar(100), @orby) + ' ASC'
END
END
END
RETURN @StrSql
END
---提取最后一页数据的处理
ALTER FUNCTION GetFactCount(@dcount INT, @psize INT, @pindex INT)
returns INT
AS
BEGIN
DECLARE @fcount INT
IF (@pindex = @dcount) --表示当前提取的是未页数据
BEGIN
IF (@dcount % @psize = 0)
BEGIN
SET @fcount = @psize
END
ELSE
BEGIN
SET @fcount = @dcount % @psize
END
END
ELSE
BEGIN
SET @fcount = @psize
END
RETURN @fcount
END
---获取数据分页的总页数
ALTER FUNCTION GetPageCount(@dcount INT, @psize INT)
returns INT
AS
BEGIN
DECLARE @pcount INT
IF (@dcount % @psize = 0)--表示页数刚好被整除
BEGIN
SET @pcount = @dcount / @psize --偶数的情况下计算总页数
END
ELSE
BEGIN
SET @pcount = (@dcount / @psize) + 1 --奇数的情况下计算总页数
END
RETURN @pcount
END
--获取所取数据的页数
ALTER FUNCTION GetPageIndex(@count INT, @current INT)
returns INT
AS
BEGIN
DECLARE @Half FLOAT
DECLARE @result INT
IF (@count % 2 = 0)--总记录条数为偶数
BEGIN
SET @Half = @count / 2 --计算出总页数的中间分界点
IF (@current < @Half)--判断传进来的页码是否小于分界页码
BEGIN
SET @result = (@Half + 1) + (@Half - @current)
END
ELSE IF (@result = @Half)
BEGIN
SET @result = @Half + 1
END
ELSE
BEGIN
SET @result = (@Half + 1) - (@current - @Half)
END
END
ELSE--总记录条数为奇数
BEGIN
SET @Half = @count / 2 + 1 --计算出总页数的中间分界点
IF (@current < @Half)--判断传进来的页码是否小于分界页码
BEGIN
SET @result = @Half + (@Half - @current)
END
ELSE IF (@current = @Half)
BEGIN
SET @result = @Half
END
ELSE
BEGIN
SET @result = @Half - (@current - @Half)
END
END
RETURN @result
END
GO