我的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秒内

有一个最大的弊端是连接的语句不能有两个字段相同的,一旦相同则会报错

对了,还有一张图:

  

 

 

 

 

 

 

 

posted @ 2012-12-13 00:47  钢铁加鲁鲁二号  阅读(173)  评论(0编辑  收藏  举报