成熟sql 分页存储过程(UP_Common_GetPage)
View Code
1 GO
2 /****** Object: StoredProcedure [dbo].[UP_Common_GetPage] Script Date: 03/17/2011 11:16:21 ******/
3 SET ANSI_NULLS ON
4 GO
5 SET QUOTED_IDENTIFIER ON
6 GO
7 -- =============================================
8 -- Author:
9 -- Create date: 2-20
10 -- Description: 分页存储过程
11 -- =============================================
12 ALTER PROCEDURE [dbo].[UP_Common_GetPage]
13 @tblName nvarchar(255), -- 表名
14 @strGetFields nvarchar(1000) = '*', -- 需要返回的列
15 @fldName nvarchar(255)='', -- 排序的字段名
16 @PageSize int = 10, -- 页尺寸(每页记录数)
17 @PageIndex int = 1, -- 页码
18 @OrderType bit = 0, -- 设置排序类型, 非0值则降序
19 @strWhere nvarchar(1500) = '', -- 前缀 and 的 查询条件 (注意: 不要加 where)
20 @RowCount int output -- 返回记录总数
21 AS
22 SET ANSI_WARNINGS ON
23 declare @strSQL nvarchar(4000) -- 主语句
24 declare @strTmp nvarchar(110) -- 临时变量
25 declare @strOrder nvarchar(400) -- 排序类型
26 set @strSQL = 'select @RowCount=ISNULL(count(*),0) from ' + @tblName + ' where 1=1 '+@strWhere
27 exec sp_executesql @strSQL,N'@RowCount int output',@RowCount out
28
29 --insert into sqllogs(sqllogs) values(@strSQL+'cnt:'+cast(@RowCount as varchar(500)))
30
31 IF @RowCount=0
32 BEGIN
33 RETURN
34 END
35 IF @RowCount<( @PageIndex-1)*@PageSize
36 BEGIN
37 set @PageIndex=1
38 END
39
40 --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
41 set @strSQL =''
42 if @OrderType!= 0 -- 降序(desc)
43 begin
44 set @strTmp = '<(select min'
45 set @strOrder = ' order by ' + @fldName +' desc'
46 --如果@OrderType不是0,就执行降序,这句很重要!
47 end
48 else -- 升序(asc)
49 begin
50 set @strTmp = '>(select max'
51 set @strOrder = ' order by ' + @fldName +' asc'
52 end
53 if @PageIndex = 1 --// 页码
54 begin
55 set @strSQL = 'select top ' +str(@PageSize)+ ' ' +@strGetFields+ ' from ' + @tblName + ' where 1=1 ' + @strWhere + ' ' + @strOrder
56 --如果是第一页就执行以上代码,这样会加快执行速度
57
58 --insert into sqllogs(sqllogs) values(@strSQL+' 1 --// 页码 ')
59 end
60 else
61 begin --以下代码赋予了@strSQL以真正执行的SQL代码
62 set @strSQL ='select top ' +str(@PageSize)+ ' ' +@strGetFields+ ' from ' +@tblName+ ' where ' +@fldName+ ' ' +@strTmp+ '( ' +@fldName+ ' ) from (select top ' +str((@PageIndex-1)*@PageSize) + ' ' +@fldName+ ' from ' +@tblName+ ' where 1=1 ' +@strWhere+ ' ' +@strOrder+ ') as tblTmp) ' +@strWhere+ ' ' +@strOrder
63 --insert into sqllogs(sqllogs) values(@strSQL+'真正执行的SQL代码 ')
64 end
65 --print @strSQL
66 exec (@strSQL)