MS SQLSERVER通用存储过程分页

 最近在面试的时候,遇到个奇葩的秃顶老头面试官。

问:写过存储过程分页吗?

答:没写过,但是我知道分页存储的原理,我自己也写过,只是在工作中没写过。

问:那你这么多年工作中就没写过吗?

答:的确没写过,因为项目数据量都特别小。

然后,这奇葩就起身就要走人了,连个招呼都没有。想我面试了这么多公司,这种奇葩面试官,还是头回见到,一点职业素质,礼貌都木有。气死我了!

    明天要去入职新公司了,今天闲来无事,试着写了写这个存储过程分页。只在SQLSERVER2008上测试过,不过我想,2000以上版本应该都会支持的吧。

    废话到此,上代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
if (object_id( 'Proc_Paging' 'P' is  not  null )
     drop  proc Proc_Paging
go
create  procedure  Proc_Paging
(
     @TableName  varchar (20), --表名
     @PageIndex  int =0, --起始页索引,从0开始
     @PageSize  varchar (1000)= '10' , --默认每页显示的数量,默认每页显示10条记录
     @Params  varchar (100)= '*' , --分页结果中显示的字段,默认显示全部的字段
     @ID  varchar (20)= 'ID' , --数据编号排序字段,默认为ID
     @OrderByID  varchar (20)= 'asc' , --数据编号排序方式,默认为正序排序
     @StrWhere  varchar (100), --分页数据的查询条件,必须以where开头
     @StrWhere2  varchar (100), --已经分页的数据的查询条件,不能以where开头
     @OrderBy  varchar (100)= 'ID asc' --数据排序方式
)
as
declare  @Sql  varchar (8000),@PageStartNum  varchar (1000),@PageEndNum  varchar (1000),@Sql2  varchar (1000),@Sql3  varchar (1000)
--1.获取指定页数据
set  @PageStartNum=(@PageIndex)*(@PageSize) --起始数据编号
set  @PageEndNum=(@PageIndex+1)*(@PageSize) --截止数据编号
set  @Sql= 'select row_number() over(order by ' +@ID+ ' ' +@OrderByID+ ') Num,' +@Params+ ' ' +
'into #temp ' +
'from ' +@TableName+ ' ' +@StrWhere+ '' +
'select * from #temp where Num between ' +
'' +(@PageStartNum)+ ' and ' +(@PageEndNum)+ ' ' +@StrWhere2+ ' order by ' +@OrderBy+ ' '
exec (@Sql)
--print @Sql
--2.获取总记录数
set  @Sql2= 'select count(1) from ' +@TableName+ ''
exec (@Sql2)
--print @Sql2
--3.获取分页总数
set  @Sql3= 'select ceiling(count(1)*1.0/(' +@PageSize+ ')) from ' +@TableName+ ''
exec (@Sql3)
--print @Sql3
go
--测试代码
exec  Proc_Paging  'Customers' ,2,10, 'CustomerID,CompanyName,Address,City,PostalCode' , 'CustomerID' , 'asc' , 'where PostalCode>' '1000' ' ' , 'and Num>1 ' , 'Num asc'
go

下面是运行结果截图。

执行结果:

wKioL1UvfJPAQF7DAAKy9EZv-io744.jpg

生成的sql语句:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值