MSSQL存储过程分页,ASP存储过程分页

作者:Johnny 时间:2009-09-11 12:50:00 

网络开发的在分页上要是遇到数(几十)万以上的数据还是用ADO那样的分页会速度很慢的。有了存储过程速度就快多了。

下面是本人用50万的数据进行的测试可以用的存储过程(网络上的好多都是不能用)和不用存储过程时间比较,前者0.2~0.7秒左右,后者要8~10秒左右。

显示如下:

在ASP中用ADO的要                                    所需时间:24.516秒

1、存储过程完整代码如下

======开始========
/*=================
ASP+MSSQL存储过程分页
Johnny 2008-3-5
QQ:40623660
===================*/
if exists(select name from sysobjects where name='PagePROC' and type='p')
drop procedure PagePROC
go
create procedure dbo.PagePROC --要修改过程把Create改为alter 

@TblName    varchar(100),        --200表名 
@ID        varchar(50),        --200表的主键 
@FldName    varchar(200)='*',    --200要显示的列名,如id,name,tel,.... 
@StrWhere    varchar(500)='',        --200排序条件,格式:不用写where
@OrderType    int = 0,        --11设置排序类型, 1降序,0升 
@PageSize    int,            --3每页显示多少条记录    
@CurrentPage    int            --3当前页,pageNo 

AS 
SET NOCOUNT ON --当 SET NOCOUNT 为 ON 时,存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。 
declare @strSQL    varchar(2000)    -- 主语句 
declare @strTmp    varchar(1000)    -- 临时SQL变量 
declare @strOrderBy    varchar(50)    -- 临时排序变量 
declare @strOrder    varchar(500)    -- 排序类型 
declare @recordCount    varchar(1000)    -- 总记录主语句,即RecordCount 
--declare @PageCount    int        -- 总页数

/*--=======判断排条件,格式=========== 
if @StrWhere <> ''
    set @StrWhere=' firstName like ''%'+@StrWhere+'%'' and lastName like ''%'+@StrWhere+'%'''
*/
--=======判断排序条件,格式=========== 
if @OrderType <> 0 --即降序 
    begin 
    set @strOrderBy = '<(select min' 
    set @strOrder = ' order by [' + @ID + '] desc' 
    end 
else 
    begin 
    set @strOrderBy = '>(select max' 
    set @strOrder = ' order by [' + @ID +'] asc' 
    end 
--============默认情况的SQL===========
Set @strTmp =' Select top ' + str(@PageSize) +' '+ @FldName +' from '+ @TblName   
--=========判断当前是否第一页,并执行相应的代码,这样会加快执行速度===============
if @CurrentPage =1
    Begin   
        if @StrWhere <> '' 
            Begin 
            Set @strSQL=@strTmp +' Where '+@StrWhere+' '+@strOrder 
            set @recordCount='select count('+@ID+') as RecordCount from '+ @TblName+' Where '+@StrWhere
            End 
        else 
            Begin 
            Set @strSQL=@strTmp +' '+@strOrder 
            set @recordCount='select count('+@ID+') as RecordCount from '+ @TblName 
            End 
    End 
else
    Begin
        if @StrWhere <> '' --有where条件查询时 
            Begin 
            Set @strSQL=@strTmp + ' where '+@ID+' '+ @strOrderBy+'('+@ID+') from (select top ' + str((@CurrentPage-1)*@PageSize)+' '+@ID+' from '+ @TblName+' Where '+@StrWhere+' '+@strOrder+' ) as tblTmp ) and '+ @StrWhere +' '+ @strOrder 
            set @recordCount='select count('+@ID+') as RecordCount from '+ @TblName+' Where '+@StrWhere 
            End 
        
        else -----------------------------------------无where条件时 
            Begin 
            Set @strSQL=@strTmp + ' where '+@ID+' '+ @strOrderBy+'('+@ID+') from (select top ' + str((@CurrentPage-1)*@PageSize)+' '+@ID+' from '+ @TblName+' '+@strOrder+' ) as tblTmp )'+' '+ @strOrder 
            set @recordCount='select count('+@ID+') as RecordCount from '+ @TblName   
            End 
    End

exec (@strSQL) 
exec (@recordCount)
go
========完=======

2、ASP调用存储存储过程

ASP调用存储存要求是掌握ASP基础,才对下面的部分核心代码看得懂。

ASP调用存储存储过程一般用:adodb.command。如下:

’======开始==================
'这里连接数据库
Dim ConnStr,Conn
'''''''''''''''''''''''''''''''''SQL数据库 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'(local)或127.0.0.1或.        '连接IP   本地用 (local)或127.0.0.1 或一个点.,外地用IP
'sa             '数据库用户名
'123456         '用户密码
'johnnyData       '数据库名
ConnStr = "Provider=SQLOLEDB;Server=127.0.0.1;Database=johnnyData;UID=sa;PWD=123456"
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
On Error Resume Next
Set Conn=Server.CreateObject("ADODB.Connection")
Conn.open ConnStr
If Err Then
   err.Clear
   Set Conn = Nothing
   Response.Write ("<div style='font-size:14px;color=#ff0000' align='center'>数据库连接出错,请检查数据库连接字串ConnStr </div>")
   Response.End
End If

set recom = server.createobject("adodb.command")
recom.activeconnection = ConnStr
recom.commandtype = 4
recom.CommandTimeout = 0
recom.Prepared = true
recom.commandtext = "dbo.PagePROC"
'这里给要参数传值
TblName="testtable"   '表名
id="ID"   '主键名
FldName="id,firstName,lastName"   '要显示的列名
StrWhere=“”   '条件可以自己写,如:firstName=‘johnny’
OrderType=0 '0为升,1为降
PageSizeX = 10
PageNo = Clng(Request("PageNo"))'int最大值只有到32767.
If PageNo<=0 or PageNo="" Then    PageNo=1
recom.Parameters.Append recom.CreateParameter("@TblName",202,1,100,TblName)
recom.Parameters.Append recom.CreateParameter("@ID",202,1,20,id)
recom.Parameters.Append recom.CreateParameter("@FldName",202,1,100,FldName)
recom.Parameters.Append recom.CreateParameter("@StrWhere",202,1,200,StrWhere)
recom.Parameters.Append recom.CreateParameter("@OrderType",3,1,1,OrderType)
recom.Parameters.Append recom.CreateParameter("@PageSize",3,1,6,PageSizeX)
recom.Parameters.Append recom.CreateParameter("@CurrentPage",3,1,6,PageNo)

set rs = recom.execute()
if rs.eof then
   set rs=nothing : set recom=nothing : Conn.Close : set Conn=nothing
   response.write "<script>alert('当前没有找到任何记录,请返回重新操作!');history.go(-1);</script>"
   response.end
end if
'这里显示数据
while not rs.eof
   response.write(""&rs("id")&" FirstName:"&rs("FirstName")&" &nbsp;| lastName: "&rs("lastName")&"<hr/>")
rs.movenext
wend
set rs = rs.NextRecordset    '取得第2个记录集即总记录。
RecordCount=rs("RecordCount")   '得到记录总数,
response.write("共有:"&RecordCount&" 条记录,根据这个请将你个人喜欢的分页代码放在这里")
'这里就是分页了,根据个人的需要自己喜欢的分页摸版。
'最后要关闭连接
set rs=nothing : set recom=nothing : Conn.Close : set Conn=nothing
'==============完==============

上面的调用是部分的核心代码,不是全部的代码。要直接使用请

1)先将第一点的存储过程到你的MSSQL查询分析器中运行,随便插入几条数据以便分页显示。

2)再拷贝第2点的代码到你的页面上改数据库连接字符串ConnStr 。

标签:mssql,存储过程,分页
0
投稿

猜你喜欢

  • 利用Go语言搭建WebSocket服务端方法示例

    2024-05-08 10:14:43
  • 我的论坛源代码(九)

    2023-11-15 05:50:05
  • 快速解决Django关闭Debug模式无法加载media图片与static静态文件

    2023-05-28 02:54:43
  • 推荐几款MySQL相关工具

    2024-01-23 10:42:12
  • SQL常用日期查询语句及显示格式设置

    2024-01-25 06:57:37
  • python3使用pandas获取股票数据的方法

    2023-01-04 15:01:15
  • python 多线程中子线程和主线程相互通信方法

    2021-05-13 03:56:44
  • jQuery实现弹出带遮罩层的居中浮动窗口效果

    2024-04-19 10:17:20
  • 用Python将mysql数据导出成json的方法

    2024-01-26 09:08:58
  • ORACLE数据库事务隔离级别介绍

    2012-10-07 10:43:36
  • 8段用于数据清洗Python代码(小结)

    2023-10-01 06:04:25
  • PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数

    2023-06-09 01:05:00
  • Python轻松搞定视频剪辑重复性工作问题

    2022-12-18 16:06:54
  • Python求正态分布曲线下面积实例

    2021-01-28 18:20:07
  • Python制作进度条的几种方法

    2022-03-11 05:36:23
  • 在Python中使用__slots__方法的详细教程

    2022-10-30 09:46:10
  • 判断浏览器是否接受 Cookie

    2009-07-28 17:52:00
  • 基于Vue3实现日历组件的示例代码

    2024-05-29 22:25:16
  • 关于vue3中setup函数的使用

    2024-06-05 09:16:16
  • next在python中返回迭代器的实例方法

    2022-10-28 12:35:41
  • asp之家 网络编程 m.aspxhome.com