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

 

版权声明:本文为programsky原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/programsky/p/4605686.html