代码改变世界

SQL语句实现分页查询

2011-08-15 17:16  Eric.Hu  阅读(801)  评论(0编辑  收藏  举报

declare @strTableName varchar(50) --表名
declare @strColumnPage varchar(50) --按照该列进行分页
declare @intColumnType int --@strColumn列的类型 0为数字 1为字符 2 掌?br> declare @intOrder int --排序 0为顺序 1为倒序
declare @strColumnList varchar(800) --要查询出的字段列表,*表示全部字段
declare @intPageSize int --每页记录数
declare @intPageNum int --页号
declare @strWhere varchar(800) --查询条件
declare @intPageCount int --总页数

set @strTableName = 'T01' --表名
set @strColumnPage = 'ID' --按照该列进行分页
set @intColumnType = 0 --@strColumn列的类型 0为数字 1为字符 2 为日期
set @intOrder = 1 --排序 0为顺序 1为倒序
set @strColumnList = '*' --要查询出的字段列表,*表示全部字段
set @intPageSize = 10 --每页记录数
set @intPageNum = 2 --页号
set @strWhere = '' --查询条件
set @intPageCount = 0 --总页数

--功能代码
declare @sql nvarchar(4000) --用于构造SQL语句
declare @where1 varchar(800) --条件语句1
declare @where2 varchar(800) --条件语句2

if @strWhere is null or rtrim(@strWhere)=''
--为了避免SQL关键字、表名等连在一起,注意空格的添加
begin --没有查询条件
set @where1=' where '
set @where2=' '
end
else --有查询条件
begin
set @where1=' where ('+@strWhere+') and '
set @where2=' where ('+@strWhere+') '
end

set @strColumnPage=' '+@strColumnPage+' '
set @intColumnType=' '+@intColumnType+' '
--构造SQL语句,计算总页数。计算公式为 总页数=Ceiling(记录个数/页大小)

set @sql='select @intPageCount=Ceiling((count(*)+0.0)/'+cast(@intPageSize as varchar)+') from '+@strTableName + @where2
--执行SQL语句,计算总页数,并将其放入@intPageCount变量中

--print @sql

exec sp_executesql @sql,N'@intPageCount int output',@intPageCount output
--将总页面数放到查询返回记录集的第一个字段钱,次语句可以省略

set @strColumnList=' '+cast(@intPageCount as varchar(30))+' as PageCount, '+@strColumnList

if @intOrder=0 --构造升序的SQL
set @sql='select top '+cast(@intPageSize as varchar)+@strColumnList+' from '+@strTableName+@where1+@strColumnPage+' >(select max('+@strColumnPage+') from(select top '+cast(@intPageSize*(@intPageNum-1) as varchar)+' '+@strColumnPage+' from '+@strTableName+@where2+' order by '+@strColumnPage+') t) order by'+@strColumnPage
else
set @sql='select top '+cast(@intPageSize as varchar)+@strColumnList+' from '+@strTableName+@where1+@strColumnPage+' <(select min('+@strColumnPage+') from(select top '+cast(@intPageSize*(@intPageNum-1) as varchar)+' '+@strColumnPage+' from '+@strTableName+@where2+' order by '+@strColumnPage+' desc) t) order by'+@strColumnPage+' desc '

if @intPageNum=1 --第一页
set @sql='select top '+cast(@intPageSize as varchar)+@strColumnList+' from '+@strTableName+@where2+' order by '+@strColumnPage+case @intOrder when 0 then '' else ' desc'
end

--print @sql

exec(@sql)