我的SQL数据库分页

废话不多说,直接上代码:

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SP_PageViewForSql]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop  Proc  SP_PageViewForSql
GO

Create proc SP_PageViewForSql
	@SQL    varchar(Max),						--要分页显示的sql语句
	--@FieldKey   nvarchar(1000),					用于定位记录的主键字段,可以是逗号分隔的多个字段
	@PageCurrent int=1,							--要显示的页码
	@PageSize   int=10,							--每页的大小(记录数)
	--@FieldOrder nvarchar(1000)='',				以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC 用于指定排序顺序
	@PageCount int OUTPUT						--总页数
as

	if (@PageCount is null)
	begin
		--检查数据源有多少条数据
		declare @sqlPge nvarchar(max)
		set @sqlPge='select @sqlCounttemp=COUNT_BIG(*) from ('+@SQL+') as table1'
		exec sp_executesql @sqlPge,N'@sqlCounttemp int output',@PageCount output
	end
	
	select @PageCount
	--定义最大页数
	declare @PageMax varchar(200)
	if(@PageSize*(@PageCurrent+1)<@PageCount)
		set @PageMax=CONVERT(varchar(50),@PageSize*(@PageCurrent+1))
	else
		Set @PageMax=CONVERT(varchar(50),@PageCount)
		
	--查找所需要的数据源
	declare @SqlTemp varchar(Max)
	set @SqlTemp='WITH table1 as('+@SQL+' )	SELECT * FROM table1
WHERE [Rows] BETWEEN '+CONVERT(varchar(50),@PageSize*(@PageCurrent))+' AND '+@PageMax
	print @SqlTemp
	exec(@SqlTemp)
	


 附加的测试语句:

    exec SP_PageViewForSql 'SELECT row_number() OVER (ORDER BY TbWmStep.stepID) AS [Rows],TbWmStep.* from TbWmAreaRight inner join TbWmStep 
 on TbWmAreaRight.StepID=TbWmStep.StepID ',100000,25,NULL


在我的机器(E6500+4G1333+500G7200转)上测试,查询1000000-1000025数据用到的时间是3秒,大于2百万的控制在10秒内
 
有一个最大的弊端是连接的语句不能有两个字段相同的,一旦相同则会报错
 
对了,还有一张图:
>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值