分页存储过程

80酷酷网    80kuku.com

  存储过程|分页

测试了下,1200000条数据,查询不到1分钟,而使用传统的查询方法,要好几分钟

/*分页存储过程
Descript:分页存储过程
Author:Blue.Dream
Date:2004-8-18 21:01
*/
CREATE  PROCEDURE ListPage(
tblName  nvarchar(200),           ----要显示的表或多个表的连接
fldName  nvarchar(200) = '*',          ----要显示的字段列表
pageSize int = 10,                    ----每页显示的记录个数
page  int = 1,           ----要显示那一页的记录
pageCount int = 1 output,          ----查询结果分页后的总页数
Counts int = 1 output,           ----查询到的记录数
ID  nvarchar(50),  ----主表的主键
fldSort nvarchar(100) = null,          ----排序字段列表或条件
Sort  bit = 0,           ----排序方法,0为升序,1为降序
strCondition nvarchar(200) = null ----查询条件,不需where
)
AS
SET NOCOUNT ON
Declare sqlTmp nvarchar(1000)  ----存放动态生成的SQL语句
Declare strTmp nvarchar(1000)  ----存放取得查询结果总数的查询语句
Declare strID  nvarchar(1000)  ----存放取得查询开头或结尾ID的查询语句
Declare sqlSort nvarchar(200)  ----存放临时生成的排序条件
Declare intCounts int   ----要移动的记录数
Declare BeginID int   ----开始的ID
Declare EndID   int   ----结束的ID

--------首先生成排序方法---------
if Sort=0  --升序
begin
   if not(fldSort is null)
  set sqlSort = ' Order by ' + fldSort 
   else
  set sqlSort = ' Order by ' + ID 
end
else   --降序
begin
 if not(fldSort is null)
  set sqlSort = ' Order by ' + fldSort + ' DESC'  
 else
  set sqlSort = ' Order by ' + ID + ' DESC '
end

--------生成查询语句--------
--此处strTmp为取得查询结果数量的语句
if strCondition is null --没有设置显示条件
 begin
 set sqlTmp =  fldName + ' From ' + tblName
 set strTmp = 'select Counts=Count(' + ID + ') FROM
 set strID = ' From ' + tblName
 end
else
 begin
 set sqlTmp = + fldName + 'From ' + tblName + ' where ' + strCondition
 set strTmp = 'select Counts=Count(' + ID + ') FROM + ' where ' + strCondition
 set strID = ' From ' + tblName + ' where ' + strCondition
 end
 

----取得查询结果总数量-----
exec sp_executesql strTmp,N'Counts int out ',Counts out

--取得分页总数
if Counts <= pageSize
 set pageCount = 1
else
 set pageCount = (Counts / pageSize) + 1

--计算要移动的记录数
if page = 1
 set intCounts = pageSize
else
begin
 set intCounts = (page-1) * pageSize + 1
end

-----取得分页后此页的第一条记录的ID
set strID = 'select BeginID=' + ID + ' ' + strID

set intCounts = intCounts - pageSize + 1
set rowcount  intCounts
exec sp_executesql strID,N'BeginID int out ',BeginID out

-----取得分页后此页的最后一条记录的ID
set intCounts = intCounts + pageSize - 1
print intCounts
set rowcount  intCounts
exec sp_executesql strID,N'BeginID int out ',EndID out

------恢复系统设置-----
set rowcount  0
SET NOCOUNT ON

------返回查询结果-----
if strCondition is null
 set strTmp = 'select ' + sqlTmp + ' where ' + ID + ' between ' + str(BeginID) + ' and ' + str(EndID)
else
 set strTmp = 'select ' + sqlTmp + ' where ' + ID +' (between ' + str(BeginID) + ' and ' + str(EndID) + ')  and ' + strCondition

if not(sqlSort is null)
set strTmp = strTmp + sqlSort
exec sp_executesql strTmp
GO



分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: