千万数量级分页存储过程

ALTER PROCEDURE[dbo].[UP_DividePage]
/*
***************************************************************
** 千万数量级分页存储过程**
多表查询建议先建视图
***************************************************************
参数说明:
1.Tables :表名或视图名
2.PrimaryKey :主关键字
3.Sort :排序语句,不带Order By 比如:UserId Desc需为主键,否则查询太慢,只能有一个排序字段
4.CurrentPage :当前页码
5.PageSize :分页尺寸
6.Fields :字段列表(默认为:*)
7.Filter :过滤语句,不带Where 
8.Group :Group语句,不带Group By
9.ReturnCount:1,返回记录总数,0,返回数据集
***************************************************************/
(
@Tables varchar(2000),
@PrimaryKey varchar(500),
@Sort varchar(500) = NULL,
@CurrentPage int=1,
@PageSize int=10,
@Fields varchar(2000) ='*',
@Filter varchar(1000) =NULL,
@Group varchar(1000) =NULL,
@ReturnCount bit
)
AS
--将排序的小写字母转换为大写
IF CHARINDEX('asc',@Sort)>0
SET @Sort = REPLACE(@Sort, 'asc', 'ASC')
ELSE IF CHARINDEX('desc',@Sort)>0 
SET @Sort = REPLACE(@Sort, 'desc', 'DESC')
/*默认排序*/
IF @Sort IS NULL OR @Sort=''
SET @Sort = @PrimaryKey


DECLARE @SortTable varchar(1000)
DECLARE @SortName varchar(1000)
DECLARE @strSortColumn varchar(1000)
DECLARE @operator char(2)
DECLARE @type varchar(1000)
DECLARE @prec int


--设置用于分页的排序字段和比较符号
IF CHARINDEX('DESC',@Sort)>0
BEGIN
SET @strSortColumn=REPLACE(@Sort, 'DESC', '')
SET @operator='<='
END
ELSE IF CHARINDEX('ASC', @Sort)>0
BEGIN
SET @strSortColumn=REPLACE(@Sort, 'ASC', '')
SET @operator='>='
END
ELSE
BEGIN
SET @strSortColumn=@Sort
SET @operator='>='
END


IF CHARINDEX('.', @strSortColumn) >0
BEGIN
SET @SortTable=SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn))
SET @SortName=SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) +1, LEN(@strSortColumn))
END
ELSE
BEGIN
SET @SortTable=@Tables
SET @SortName=@strSortColumn
END


SELECT @type=t.name, @prec=c.prec
FROM sysobjects o 
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
WHERE o.name =@SortTable AND c.name =@SortName


IF CHARINDEX('char', @type) >0
SET @type=@type+'('+CAST(@prec AS varchar) +')'


DECLARE @strPageSize varchar(500)
DECLARE @strStartRow varchar(500)
DECLARE @strFilter varchar(1000)
DECLARE @strSimpleFilter varchar(1000)
DECLARE @strGroup varchar(1000)
/*默认当前页*/
IF @CurrentPage<1
SET @CurrentPage=1


/*设置分页参数.*/
SET @strPageSize=CAST(@PageSize AS varchar(500))
SET @strStartRow=CAST(((@CurrentPage-1)*@PageSize+1) AS varchar(500))


/*筛选以及分组语句.*/
IF @Filter IS NOT NULL AND @Filter!=''
BEGIN
SET @strFilter=' WHERE '+@Filter+''
SET @strSimpleFilter=' AND '+@Filter+''
END
ELSE
BEGIN
SET @strSimpleFilter=''
SET @strFilter=''
END


IF @Group IS NOT NULL AND @Group!=''
SET @strGroup=' GROUP BY '+@Group+''
ELSE
SET @strGroup=''


/*执行查询语句*/
IF @ReturnCount = 1
EXEC(
 'SELECT count(*) from ' + @Tables + @strFilter
)
ELSE
EXEC(
'
DECLARE @SortColumn '+@type+'
SET ROWCOUNT '+@strStartRow+'
SELECT @SortColumn='+@strSortColumn+' FROM '+@Tables+@strFilter+' '+@strGroup+' ORDER BY '+@Sort+'
SET ROWCOUNT '+@strPageSize+'
SELECT '+@Fields+' FROM '+@Tables+' WHERE '+@strSortColumn+@operator+' @SortColumn '+@strSimpleFilter+' '+@strGroup+' ORDER BY '+@Sort+'
')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值