T-SQL分页存储过程
最近忙于找工作,面试时,遇到面试官要用我用T-SQL语句写一个分页存储过程,当时我一下子就傻了,好长时间没有写了,一时都忘记了,趁着今天有空,花时间写了一下,下面将Code粘贴出来,如有错误之处,望大家指正。
第一个存储过程相对比较复杂,传入参数较多,涉及到排序。第二个存储过程相对简单点。
分页存储一: www.2cto.com
1 create Procedure prc_GetRecordForPaging
2 @tableName varchar(255),--表名
3 @fieldName varchar(255),--字段名称
4 @pageSize int=10, --单页显示大小
5 @pageIndex int=1, --页码
6 @orderType bit=0, --设置排序类型,非0则是降序
7 @strCondition varchar(2000)='' --查询条件(注意,不要添加where语句)
8 as
9 declare @strSQL varchar(6000) --主执行语句
10 declare @strTemp varchar(1000) --临时执行语句
11 declare @strOrder varchar(500) --排序语句
12 if @orderType != 0 --降序
13 begin
14 set @strTemp='< (select min'
15 set @strOrder=' order by ['+@fieldName+'] desc' --排序语句
16 end
17 else -- 升序
18 begin
19 set @strTemp ='> (select Max'
20 set @strOrder =' order by ['+@fieldName+'] asc'
21 end
22 set @strSQL ='select top'+str(@pageSize)+' * from '
23 + @tableName+'] where ['+ @fieldName+ ']'
24 + @strTemp+ '(['+ @fieldName+ ']) from ( select top'+
25 + str(@pageSize*(@pageIndex-1))+'['
26 + @fieldName +'] from ['+ @tableName+']'
27 + @strOrder + ') as tableTemp)'
28 + @strOrder www.2cto.com
29
30 if @strCondition != ''
31 set @strSQL ='select top'+str(@pageSize)+' * from '
32 + @tableName+'] where ['+ @fieldName+ ']'
33 + @strTemp+ '(['+ @fieldName+ ']) from ( select top'+
34 + str(@pageSize*(@pageIndex-1))+'['
35 + @fieldName +'] from ['+ @tableName+'] where '
36 + @strCondition + '' + @strOrder + ') as tableTemp) and'
37 + @strCondition + '' + @strOrder
38 if @pageIndex = 1
39 begin
40 set @strTemp =''
41 if @strCondition !=''
42 set @strTemp =' where ('+ @strCondition + ')'
43
44 set @strSQL ='select top'+ str(@pageSize)+ ' * from ['
45 + @tableName+ ']'+ @strTemp+ '' + @strOrder
46 end
47 Execute(@strSQL)
48 Go
分页存储二:
1 create procedure pro_GetRecordForPaging
2 @tableName varchar(200),--表名
3 @pageSize int, --每页显示记录数
4 @pageIndex int, --当前页码
5 @colName varchar(30) --排序的字段名
6 as www.2cto.com
7 begin
8 declare @strSQL varchar(300)
9 if @pageIndex = 1
10 set @strSQL ='select top ['+cast(@pageSize as varchar(20)) + ']'
11 + ' * from ['+ @tableName + ']'
12 + ' order by ['+ @colName + ']'
13 else
14 set @strSQL='select top ['+cast(@pageSize as varchar(20)) + ']'
15 + ' * from ['+ @tableName + ']'
16 + ' where ['+ @colName + ']'
17 + ' not in ( select top ['
18 + cast((@pageIndex-1)*pageSize as varchar(20)) + ']'
19 + @colName + ' from ['+ @tableName + ']'
20 + 'order by ['+ @colName +'])'
21 + 'order by ['+ @colName +']'
22 --print
23 Execute(@strSQL)
24 end
25 go
作者 Peter Luo