建站学 - 轻松建站从此开始!

建站学-个人建站指南,网页制作,网站设计,网站制作教程

当前位置: 建站学 > 数据库 > MSSQL Server教程 >

实现千万级数据的分页的通用存储过程

时间:2010-03-09 14:49来源: 作者: 点击:
实现千万级数据的分页的通用存储过程
01 set ANSI_NULLS ON
02 set QUOTED_IDENTIFIER ON
03 go
04   
05 /* 
06 功能描述: 通用分页显示查询 
07 如果有自增标识字段,在@strGetFields中不要加入此字段信息, 
08 如果非要加入的话,要 (fldName + 0) AS fldName 这样处理; 
09 输入参数: 
10 @tblName: 表名 
11 @strGetFields: 需要返回的列 '*':返回所以列信息 
12 @PageSize: 页尺寸 
13 @PageIndex: 页码 
14 @doCount: 返回记录总数, 非 0 值则返回 
15 @strOrderBy: 排序字段信息,(注意: 不要加 ORDER BY
16 格式: Field1 DESC, Field2 ASC 
17 @strWhere: 查询条件,(注意: 不要加 WHERE
18 输出参数: @RecordCount: 记录总数 
19 作 者: Nestcn 
20 创建时间: 2010-03-09 
21 更改纪录: 
22 */ 
23 ALTER PROCEDURE [dbo].[MyPagination] 
24
25 @tblName varchar(255), 
26 @strGetFields varchar(1000) = '*'
27 @PageSize int = 10, 
28 @PageIndex int = 1, 
29 @doCount bit = 0, 
30 @strOrderBy varchar(500) = ''
31 @strWhere varchar(1500) = ''
32 @RecordCount int output 
33
34 AS 
35 -- 主语句 
36 DECLARE @strSQL varchar(5000) SET @strSQL = '' 
37 -- 排序变量 
38 DECLARE @strOrder varchar(400) SET @strOrder = '' 
39   
40 SET @RecordCount = 0 
41 --如果@doCount传递过来的不是0,就执行总数统计 
42 IF (@doCount != 0) 
43 BEGIN 
44 DECLARE @sWhere varchar(2000) 
45   
46 SET @sWhere = '' 
47 IF (@strWhere != ''
48 SET @sWhere = ' WHERE ' + @strWhere 
49   
50 SET @strSQL = 'if exists (select * from dbo.sysobjects where id = object_id(''[dbo].[tmpTable]'') and OBJECTPROPERTY(id, ''IsUserTable'') = 1) ' 
51 SET @strSQL = @strSQL + ' UPDATE tmpTable SET Total = (SELECT COUNT(*) FROM [' + @tblName + '] ' + @sWhere + ') ' 
52 SET @strSQL = @strSQL + ' ELSE SELECT COUNT(*) AS Total INTO tmpTable FROM [' + @tblName + '] ' + @sWhere 
53   
54 EXEC (@strSQL) 
55   
56 SELECT @RecordCount=Total FROM tmpTable 
57   
58 --删除总数统计临时表 
59 EXEC ('DROP TABLE tmpTable'
60 END 
61   
62 PRINT @RecordCount 
63   
64 --排序字段信息 
65 IF (@strOrderBy != ''
66 SET @strOrder = ' ORDER BY ' + @strOrderBy 
67 --如果是第一页就执行以上代码,这样会加快执行速度 
68 IF (@PageIndex = 1) 
69 BEGIN 
70 IF (@strWhere != ''
71 SET @strSQL = 'SELECT TOP ' + str(@PageSize) + ' ' + @strGetFields + ' FROM [' + @tblName + '] WHERE ' + @strWhere + @strOrder 
72 ELSE 
73 SET @strSQL = 'SELECT TOP ' + str(@PageSize) + ' ' + @strGetFields + ' FROM ['+ @tblName + '] '+ @strOrder 
74 END 
75 ELSE 
76 BEGIN 
77 --为搜索表建立自动编号 保存到临时表中 
78 SET @strSQL = 'SELECT TOP ' + str(@PageIndex*@PageSize) + ' IDENTITY(int,1,1) AS IID, ' + @strGetFields + ' INTO #tmpTable FROM [' + @tblName + ']' 
79 IF (@strWhere != ''
80 SET @strSQL = @strSQL + ' WHERE ' + @strWhere + @strOrder 
81 ELSE 
82 SET @strSQL = @strSQL + @strOrder 
83   
84 --以下代码赋予了@strSQL以真正执行的SQL代码 
85 SET @strSQL = @strSQL + ' SELECT ' + @strGetFields + ' FROM #tmpTable WHERE IID > ' + str((@PageIndex-1)*@PageSize) + ' DROP TABLE #tmpTable' 
86 END 
87   
88 PRINT @strSQL 
89   
90 --执行分页查询 
91 EXEC (@strSQL)
(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片