我的SQL数据库分页
废话不多说,直接上代码
1 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SP_PageViewForSql]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) 2 drop Proc SP_PageViewForSql 3 GO 4 5 Create proc SP_PageViewForSql 6 @SQL varchar(Max), --要分页显示的sql语句,多表连接后确认连接起来的数据集合能够有一个个字段能找到唯一一条记录 7 --@FieldKey nvarchar(1000), 用于定位记录的主键字段,可以是逗号分隔的多个字段 8 @PageCurrent int=1, --要显示的页码 9 @PageSize int=10, --每页的大小(记录数) 10 --@FieldOrder nvarchar(1000)='', 以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC 用于指定排序顺序 11 @PageCount int OUTPUT --总页数 12 as 13 14 if (@PageCount is null) 15 begin 16 --检查数据源有多少条数据 17 declare @sqlPge nvarchar(max) 18 set @sqlPge='select @sqlCounttemp=COUNT_BIG(*) from ('+@SQL+') as table1' 19 exec sp_executesql @sqlPge,N'@sqlCounttemp int output',@PageCount output 20 end 21 22 select @PageCount 23 --定义最大页数 24 declare @PageMax varchar(200) 25 if(@PageSize*(@PageCurrent+1)<@PageCount) 26 set @PageMax=CONVERT(varchar(50),@PageSize*(@PageCurrent+1)) 27 else 28 Set @PageMax=CONVERT(varchar(50),@PageCount) 29 30 --查找所需要的数据源 31 declare @SqlTemp varchar(Max) 32 set @SqlTemp='WITH table1 as('+@SQL+' ) SELECT * FROM table1 33 WHERE [Rows] BETWEEN '+CONVERT(varchar(50),@PageSize*(@PageCurrent))+' AND '+@PageMax 34 print @SqlTemp 35 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秒内
有一个最大的弊端是连接的语句不能有两个字段相同的,一旦相同则会报错
对了,还有一张图: