千万数量级分页存储过程(可支持多表查询,任意排序),就找了这一个实用的,来自网上...

千万数量级分页存储过程(可支持多表查询,任意排序)

功能不错的分页存储过程,可支持多表查询,任意排序

CreatePROCEDUREusp_PagingLarge
@TableNamesVARCHAR(200),--表名,可以是多个表,但不能用别名
@PrimaryKeyVARCHAR(100),--主键,可以为空,但@Order为空时该值不能为空
@FieldsVARCHAR(200),--要取出的字段,可以是多个表的字段,可以为空,为空表示select*
@PageSizeINT,--每页记录数
@CurrentPageINT,--当前页,0表示第1页
@FilterVARCHAR(200)='',--条件,可以为空,不用填where
@GroupVARCHAR(200)='',--分组依据,可以为空,不用填groupby
@OrderVARCHAR(200)=''--排序,可以为空,为空默认按主键升序排列,不用填orderby
AS
BEGIN
DECLARE@SortColumnVARCHAR(200)
DECLARE@OperatorCHAR(2)
DECLARE@SortTableVARCHAR(200)
DECLARE@SortNameVARCHAR(200)
IF@Fields=''
SET@Fields='*'
IF@Filter=''
SET@Filter='Where1=1'
ELSE
SET@Filter='Where'+@Filter
IF@Group<>''
SET@Group='GROUPBY'+@Group

IF@Order<>''
BEGIN
DECLARE@pos1INT,@pos2INT
SET@Order=REPLACE(REPLACE(@Order,'asc','ASC'),'desc','DESC')
IFCHARINDEX('DESC',@Order)>0
IFCHARINDEX('ASC',@Order)>0
BEGIN
IFCHARINDEX('DESC',@Order)<CHARINDEX('ASC',@Order)
SET@Operator='<='
ELSE
SET@Operator='>='
END
ELSE
SET@Operator='<='
ELSE
SET@Operator='>='
SET@SortColumn=REPLACE(REPLACE(REPLACE(@Order,'ASC',''),'DESC',''),'','')
SET@pos1=CHARINDEX(',',@SortColumn)
IF@pos1>0
SET@SortColumn=SUBSTRING(@SortColumn,1,@pos1-1)
SET@pos2=CHARINDEX('.',@SortColumn)
IF@pos2>0
BEGIN
SET@SortTable=SUBSTRING(@SortColumn,1,@pos2-1)
IF@pos1>0
SET@SortName=SUBSTRING(@SortColumn,@pos2+1,@pos1-@pos2-1)
ELSE
SET@SortName=SUBSTRING(@SortColumn,@pos2+1,LEN(@SortColumn)-@pos2)
END
ELSE
BEGIN
SET@SortTable=@TableNames
SET@SortName=@SortColumn
END
END
ELSE
BEGIN
SET@SortColumn=@PrimaryKey
SET@SortTable=@TableNames
SET@SortName=@SortColumn
SET@Order=@SortColumn
SET@Operator='>='
END

DECLARE@typevarchar(50)
DECLARE@precint
Select@type=t.name,@prec=c.prec
FROMsysobjectso
JOINsyscolumnscono.id=c.id
JOINsystypestonc.xusertype=t.xusertype
Whereo.name=@SortTableANDc.name=@SortName
IFCHARINDEX('char',@type)>0
SET@type=@type+'('+CAST(@precASvarchar)+')'

DECLARE@TopRowsINT
SET@TopRows=@PageSize*@CurrentPage+1
print@TopRows
print@Operator
EXEC('
DECLARE@SortColumnBegin'+@type+'
SETROWCOUNT'+@TopRows+'
Select@SortColumnBegin='+@SortColumn+'FROM'+@TableNames+''+@Filter+''+@Group+'orDERBY'+@Order+'
SETROWCOUNT'+@PageSize+'
Select'+@Fields+'FROM'+@TableNames+''+@Filter+'AND'+@SortColumn+''+@Operator+'@SortColumnBegin'+@Group+'orDERBY'+@Order+'
')
END

GO
--调用例子:

--1.单表/单排序
EXECusp_PagingLarge'bigtable','d_id','d_id,d_title,d_content,d_time',20,1,'','','d_iddesc'
--2.单表/多排序
EXECusp_PagingLarge'bigtable','d_id','*',20,0,'','','d_timeasc,d_iddesc'

--3.多表/单排序
EXECusp_PagingLarge'bigtableleftjoinbigtable_authoronbigtable.d_id=bigtable_author.BigTable_id','bigtable.d_id','bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author',20,0,'','','bigtable.d_idasc'

--4.多表/多排序
EXECusp_PagingLarge'bigtableleftjoinbigtable_authoronbigtable.d_id=bigtable_author.BigTable_id','bigtable.d_id','bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author',20,0,'','','bigtable.d_timeasc,bigtable.d_iddesc'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值