分页存储过程实例剖析心得
最近修改了个分页存储过程,作为菜鸟,还是从中获益良多,这里就开始今天的分页之旅了。
1.开始还原 下面先看一下原来的分页存储过程。
1 ALTER PROCEDURE [dbo].[sp_Sql_Paging]
2 (
3 @SqlDataTable NVARCHAR(4000), -- 表名
4 @PrimaryKey NVARCHAR(4000), -- 主键名称
5 @Fields NVARCHAR(4000), -- 要返回的字段
6 @pageSize INT, -- 页尺寸
7 @pageIndex INT, -- 页码
8 @recordCount INT OUTPUT, -- 记录总数
9 @strOrderBy NVARCHAR(4000), -- 排序
10 @strWhere NVARCHAR(4000) -- 查询条件
11 )
12 AS
13 BEGIN
14 SET NOCOUNT ON
15 DECLARE @strSQL1 NVARCHAR(4000) -- SQL语句1
16 DECLARE @strSQL2 NVARCHAR(4000) -- SQL语句2
17
18 -- 创建临时表
19 -- 用来保存表的编号以及主键
20 CREATE TABLE #Temp_Paging
21 (
22 Temp_Paging_Id INT,
23 RowNumber INT
24 )
25 SET @strSQL1 = 'INSERT INTO [#Temp_Paging](Temp_Paging_Id, RowNumber) SELECT ' + @PrimaryKey + ', ROW_NUMBER() OVER (' + @strOrderBy + ') AS RowNumber FROM ' + @SqlDataTable + ' ' + @strWhere
26 EXEC SP_EXECUTESQL @strSQL1
27 SET @recordCount = @@ROWCOUNT -- 取得总记录数
28
29 -- 判断页索引
30 IF @pageIndex > @recordCount * 1.0 / @pageSize + 1.0 OR @recordCount <= @pageSize
31 BEGIN
32 SET @pageIndex = 1
33 END
34
35 -- 分页查询
36 SET @strSQL2 = 'SELECT ' + @Fields + ' FROM ' + @SqlDataTable + ' WHERE ' + @PrimaryKey + ' IN (SELECT Temp_Paging_Id FROM [#Temp_Paging] WHERE RowNumber BETWEEN ' + Str((@pageIndex - 1) * @pageSize + 1) + ' AND ' + Str(@pageIndex * @pageSize) + ') ' + @strOrderBy
37 EXEC SP_EXECUTESQL @strSQL2
38 DROP TABLE #Temp_Paging -- 删除临时表
39 END
从原分页存储过程很容易看出,这里运用了临时表保存编号,然后在通过pageIndex和pageSize计算所得,进行分页。
因为这里还以主键作
相关新闻>>
- 发表评论
-
- 最新评论 更多>>