【可任意列排序存储过程分页】分享给大家看看。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值