简单分页存储过程
1 create proc proc_page( 2 @tableName varchar(50),--要进行分页的表名 3 @columnFilds varchar(500),--要查询的列,默认是*,查询所有的列 4 @whereStr varchar(500),--查询条件,不带where 关键字 5 @pKcol varchar(50),--主键列 6 @sortType int,--排序类型,0顺序,1倒叙 7 @pageSize int ,--每页的显示数量,即分页大小 8 @pageNow int, --当前页码 9 @countRecord int output,--表的总记录数 10 @pageCount int output--总页数,总页数 = 总记录数 11 ) 12 as 13 declare @sqlCount nvarchar(500) --获取总记录数、总页数的sql语句 14 declare @sqlstr varchar(8000)--获取分页信息的SQL语句 15 declare @sortstr varchar(50)--排序语句,如' order by id asc' 16 begin 17 if (@sortType=0) set @sortstr = ' order by '+ @pKcol +' asc ' --如果排序类型等于0就代表是升序 18 if (@sortType=1) set @sortstr = ' order by '+ @pKcol +' desc '--否则就是降序 19 20 begin 21 22 set @sqlCount= N'select @countRecord=count(['+@pKcol+']),@pageCount= CEILING(count('+@pKcol+')*1.0/'+cast(@pageSize as varchar(10))+')from '+@tableName+@whereStr 23 print @sqlCount 24 exec SP_EXECUTESQL @sqlCount,N'@countRecord int output,@pageCount int output',@countRecord output,@pageCount output 25 --这里面的关键点是执行时用到的SP_EXECUTESQL函数,注意在使用该函数的时候,前面的@sqlCount一定要申明为ntext/nchar/nvarchar中的其中一种,一般都是nvarchar,使用的时候(例如上面的set @sqlCount)
最好在前面加一个N(表示字符串用 Unicode 方式存储,Nvarchar的意思),24行的第一个@countRecord是指22行的动态sql内的参数,第二个@countRecord是动态sql内参数列表提供值的外部参数列表,对应存储过程里面的
表的总记录数
26 end 27 28 begin 29 set nocount on 30 if(@pageNow<2)--查询第1页 31 set @sqlstr='select top '+cast(@pageSize as varchar(10))+' '+@columnFilds+' from '+ @tableName +@whereStr+@sortstr 32 else--查询第2页以后的其他页 33 begin 34 set @sqlstr='select top '+cast(@pageSize as varchar(10))+' '+@columnFilds+' from '+ @tableName +' where '+@pKcol+' > ( 35 select max('+@pKcol+') from (select top '+cast(@pageSize*(@pageNow-1) as varchar(10))+' '+@pKcol+' from '+@tableName+@sortstr+' ) as temptable 36 )'+@sortstr 37 end 38 set nocount off 39 print @sqlstr--打印出当前的sql 40 exec (@sqlstr)--执行sql 41 end 42 43 end 44 45 --调用存储过程 46 declare @countRecord int,@pageCount int 47 exec proc_page 'teststudents_1','*',' ','id',0,10,5,@countRecord output,@pageCount output 48 select @countRecord,@pageCount 49 50 --删除存储过程 51 --drop proc proc_page