简单分页存储过程

 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

 

原文地址:https://www.cnblogs.com/programsky/p/4605686.html