废话不多说,直接上代码:
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秒内
有一个最大的弊端是连接的语句不能有两个字段相同的,一旦相同则会报错
对了,还有一张图:
>