|
mssql用存储过程实现分页功能_mssql学习_编程技术-你的首页-uuhomepage.comsql server用存储过程实现分页功能的实现代码: if exists (select name from sysobjects where name ='sp_page') drop proc sp_page go create proc sp_page @strTable varchar(50), --表名 @strColumn varchar(50), --按该列来进行分页 @intColType int, --@strColumn列的类型,0-数字类型,1-字符类型,2-日期时间类型 @intOrder bit, --排序,0-顺序,1-倒序 @strColumnlist varchar(800), --要查询出的字段列表,*表示全部字段 @intPageSize int, --每页记录数 @intPageNum int, --指定页 @strWhere varchar(800), --查询条件 @intPageCount int output --总页数 as declare @sql nvarchar(4000) --用于构造SQL语句 declare @where1 varchar(800) --构造条件语句 declare @where2 varchar(800) --构造条件语句 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 @strColumn = ' ' + @strColumn + ' ' set @strColumnlist = ' ' + @strColumnlist + ' ' --构造SQL语句,计算总页数。计算公式为 总页数 = Ceiling ( 记录个数 / 页大小 ) set @sql='select @intPageCount=ceiling((count(*)+0.0)/' + cast(@intPageSize as varchar) + ') from ' + @strTable + @where2 --执行SQL语句,计算总页数,并将其放入@intPageCount变量中 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 ' + @strTable + @where1 + @strColumn + '>(select max('+@strColumn+') '+ ' from (select top '+ cast(@intPageSize*(@intPageNum - 1) as varchar) + @strColumn + ' from '+ @strTable+@where2+'order by '+@strColumn+') t) order by '+ @strColumn else --构造降序的SQL set @sql='select top '+ cast(@intPageSize as varchar) + @strColumnlist+ ' from '+ @strTable + @where1 + @strColumn + '<(select min('+@strColumn+') '+ ' from (select top '+ cast(@intPageSize*(@intPageNum - 1) as varchar) + @strColumn + ' from '+ @strTable+@where2+'order by '+@strColumn+' desc) t) order by '+ @strColumn + ' desc' if @intPageNum=1 --第一页 set @sql='select top '+cast(@intPageSize as varchar) + @strColumnlist + ' from '+@strTable+ @where2+'order by ' + @strColumn + case @intOrder when 0 then '' else ' desc' end --PRINT @sql exec(@sql) go declare @intPageCount int exec sp_page 'Alarm1','Id',0,0,'*',20,1,'',@intPageCount output drop proc sp_page
|