1
2
3-- 通用分页查询存储过程
4 -- exec p_PageRecordset_Table '#TempTable',20,1,100,0
5 --------------------------------------------------------------
6 CREATE PROCEDURE p_PageRecordset_Table
7 (
8 @TableName NVARCHAR(100),--全局临时表名称
9 @PageSize INT, --每页的记录条数
10 @PageNumber INT, --当前页面
11 @TotalSize INT, --总记录条数
12 @TotalPage INT OUTPUT --总页数
13 )
14 AS
15 BEGIN
16
17 SET NOCOUNT ON
18 DECLARE @SqlText AS NVARCHAR(1000)
19
20 -- 计算总页数
21 IF @PageSize>0
22 BEGIN
23 SET @TotalPage=@TotalSize/@PageSize
24 IF (@PageSize*@TotalPage)<>@TotalSize
25 SET @TotalPage=@TotalPage+1
26 END
27 ELSE
28 BEGIN
29 SET @TotalPage=1
30 END
31
32 -- 校正输入参数
33 IF @PageNumber<1 SET @PageNumber=1
34 IF @PageNumber>@TotalPage SET @PageNumber=@TotalPage
35
36 IF @PageSize<=0 OR @TotalSize=0
37 BEGIN
38 --如果设置PageSize小于等于0,表示不分页。
39 SET @SqlText='
40 SELECT * FROM ' + @TableName + '
41 DROP TABLE ' + @TableName
42 END
43 ELSE
44 BEGIN
45 SET @SqlText='
46 SET NOCOUNT ON
47
48 SELECT * FROM ' + @TableName + '
49 WHERE
50 ' + CAST((@PageNumber-1)*@PageSize+1 AS NVARCHAR(30)) + '<=ROWNUM and ROWNUM<=' + CAST(@PageNumber*@PageSize AS NVARCHAR(30)) + '
51 ORDER BY ROWNUM
52
53 DROP TABLE ' + @TableName
54 END
55
56 -- PRINT @SqlText
57 EXEC(@SqlText)
58
59 End
60 GO
61
62
63 -------------------------------------
64 调用实例:
65
66
67 DECLARE @PageSize INT
68 DECLARE @PageNumber INT
69 DECLARE @TotalSize INT
70 DECLARE @TotalPage INT
71
72 SET @PageSize=5
73 SET @PageNumber=1
74
75 SET NOCOUNT ON
76
77 -- 把查询的结果放到一个临时表中,供分页处理。
78 SELECT
79 CAST(EmployeeID as INT) AS EmployeeID, -- 如果源表中有自编号的字段,要转换一下。
80 LastName,
81 FirstName,
82 BirthDate,
83 Address,
84 Region,
85 PostalCode,
86 Country,
87 IDENTITY(INT,1,1) AS ROWNUM -- 添加一个新的编号列,供分页存储过程使用。
88 INTO #tbl_p_Page_List -- 可以随机生成一个临时表名
89 FROM Employees
90 ORDER BY LastName,FirstName
91
92
93
94 --------------------------------------------------
95 -- 以下是通用的分页过程
96 --------------------------------------------------
97 --取得总记录条数
98 SELECT @TotalSize=@@ROWCOUNT
99
100 -- 调用通用的分页处理过程
101 -- 注意:临时表中必须有自动编号的字段 IDENTITY(INT,1,1) AS ROWNUM
102 EXEC p_PageRecordset_Table '#tbl_p_Page_List',
103 @PageSize,@PageNumber,@TotalSize,@TotalPage OUTPUT
104 --------------------------------------------------
105
106 PRINT @TotalSize
107 PRINT @TotalPage
108
109 GO
110
111
112
113
114
115
116下面是简单的一个用于分页的存储过程:
117
118create proc articlePages
119 @pageIndex int, --页数
120 @pageSize int, --页面显示的数据量
121 @dbFields varchar(1000) --查询的列名
122 as
123 declare @strSql varchar(5000) --查询的Sql语句
124
125 if @pageIndex = '1'
126 set @strSql='select top'+ ' ' + str(@pageSize) + + ' ' + @dbFields + ' from article order by id desc'
127 else
128 begin
129 set @strSql = 'select top'+ ' ' + str(@pageSize) +' '+ @dbFields +' '+'from article'
130 set @strSql = @strSql + ' ' + 'where id <('
131 set @strSql = @strSql + 'select min(id) from ('
132 set @strSql = @strSql + 'select top '+ str((@pageIndex-1)*@pageSize) + +' id from article order by id desc) as t' +') order by id desc'
133 end
134
135 exec(@strSql)
136
137
138
139这个存储过程的缺点是没有查询条件,并且怎么找到最后一页是多少作为参数传入呀?
140
141
142
143
144
145
146
147
148
149还有一个牛的号称千万级
150
151参数说明:
1521.Tables :表名称,视图
1532.PrimaryKey :主关键字
1543.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
1554.CurrentPage :当前页码
1565.PageSize :分页尺寸
1576.Filter :过滤语句,不带Where
1587.Group :Group语句,不带Group By
159效果演示:http://www.cn5135.com/_App/Enterprise/QueryResult.aspx
160***************************************************************/
161(
162@Tables varchar(1000),
163@PrimaryKey varchar(100),
164@Sort varchar(200) = NULL,
165@CurrentPage int = 1,
166@PageSize int = 10,
167@Fields varchar(1000) = '*',
168@Filter varchar(1000) = NULL,
169@Group varchar(1000) = NULL
170)
171AS
172GO
相关文章: