自己手写的高效分页存储过程代码

本文介绍了一个用于数据库动态分页的存储过程实现方法。该存储过程通过输入参数灵活配置表名、主键、字段等信息,支持过滤条件及排序方式,能够有效地进行分页查询。

CREATE PROCEDURE Pages
@TableNames VARCHAR(200),     --表名,可以是多个表,但不能用别名
@PrimaryKey VARCHAR(100),     --主键,可以为空,但@Order为空时该值不能为空
@Fields     VARCHAR(800),         --要取出的字段,可以是多个表的字段,可以为空,为空表示select *
@PageSize INT,             --每页记录数
@CurrentPage INT,         --当前页,0表示第1页
@Filter VARCHAR(200) = '',     --条件,可以为空,不用填 where
@Order VARCHAR(200) = ''     --排序,可以为空,为空默认按主键升序排列,不用填 order by
AS
BEGIN
declare @topRow varchar(12)
declare @tempPageSize varchar(12)
if(len(@Order)>0)
begin
set @Order=' order by '+@Order
end
else
begin
set @Order=''
end
if (len(@Filter)<1)
begin
set @Filter=' 1=1'
end
if(@CurrentPage-1<=0)
set @CurrentPage=0
set @topRow= rtrim(ltrim(str(@PageSize*(@CurrentPage-1))))
set @tempPageSize= rtrim(ltrim(str(@PageSize)))
exec('
declare @temptable table(rownum int identity(1,1),Gid varchar(12))'+'
declare @datatable table(Gid varchar(12))'+'
DECLARE @Timer datetime'+'
SET @Timer = getdate() '+'
SET NOCOUNT ON '+'
insert into @temptable(Gid) select '+@PrimaryKey+' from '+@TableNames+' where  '+@Filter+@Order+'
insert into @datatable(Gid) select top '+@tempPageSize+'Gid from @temptable where rownum>'+@topRow+'
set rowcount '+@tempPageSize+'

select '+@Fields+' from '+@TableNames+' where '+@Filter+' and '+@PrimaryKey+' in (select Gid from @datatable)'+@Order+'
set rowcount 0'+'
print(DATEDIFF(millisecond, @Timer, getdate()))')
print('insert into @temptable(Gid) select '+@PrimaryKey+' from '+@TableNames+' where  '+@Filter+@Order)
print('select '+@Fields+' from '+@TableNames+' where '+@Filter+' and '+@PrimaryKey+' in(select Gid from @datatable) '+@Order)
end
GO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值