存储过程|分页
测试了下,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