/**********************************************************************
参数:@PrimaryKey 主键,@OrderBy 排序字段,@SqlStr sql语句,@PageSize 每页显示的记录,@PageIndex 当前页(从0开始)
***********************************************************************/
ALTER procedure [dbo].[PageQuery]
@PrimaryKey varchar(100),--主键
@OrderBy varchar(100),--排序字段
@SqlStr varchar(8000),--sql语句
@PageSize int,--每页显示的记录
@PageIndex int--当前页(从1开始)
--@RecordCount int output --返回的总记录数
as
declare @ExecSql varchar(8000)--要执行的Sql组合
if @OrderBy=\'\'
set @OrderBy=\'order by \'+@PrimaryKey+\' asc\'
else if (len(@OrderBy)<8 or upper(substring(@OrderBy,1,8))<>\'ORDER BY\')
set @OrderBy=\'order by \'+@OrderBy
if @PageSize=-1--用于ajax的第一次查询
set @PageSize=0
set @PageIndex=@PageIndex-1
print(\'-----\'+CAST(@PageIndex as varchar(10)) )
begin
declare @recordCount int,@pageCount int
declare @s nvarchar(4000)
set @s = N\'select @recordCount = count(\'+@PrimaryKey+\') from (\'+@SqlStr+\') TN\'
exec sp_executeSql @s,N\'@recordCount int output\',@recordCount output
if(@pageSize>0)
set @pageCount = (@recordCount - 1 + @PageSize) / @PageSize;--总页数
else
set @pageCount = 0;--总页数
if @PageIndex<=0--如果是第一页就执行这个
begin
set @ExecSql=\'select top \'+cast(@PageSize as varchar(100))+\' * from (\'+@SqlStr+\') T \'+@OrderBy
end
else
begin
if charindex(\'2000 - 8.00.\',@@version)>0
begin
set @ExecSql=
\'select top \'+cast(@PageSize as varchar(100))+\' *
from (\'+@SqlStr+\') as T where T.\'+@PrimaryKey+\' not in
(select top \'+cast((@PageSize*@PageIndex) as varchar(100))+\' \'+@PrimaryKey+\'
from (\'+@SqlStr+\') T2 \'+@OrderBy+\') \'+ @OrderBy
end
else
begin
set @ExecSql=
\'select * from
(
select * from
(SELECT *, #RowNum#=ROW_NUMBER() OVER(\'+@OrderBy+\') FROM (\'+@SqlStr+\') T1) T2 where T2.#RowNum#>=\'+cast(@PageSize*@PageIndex+1 as varchar(10))+\' and T2.#RowNum#<=\'+cast(@PageSize*(@PageIndex+1) as varchar(10))+\'
) T3
\'
end
end
exec (@ExecSql+\' select \'+@recordCount+\' as RecordCount,\'+@pageCount+\' as PageCount \')
end