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