asp存储过程高效的动态查询结果的数据库分页三种方法

sqlPS= "select   *   From   Employee   Left   JOIN   Department   ON   Employee.DepartmentID=Department.DepartmentID   Order   By   Employee.DepartmentID,Employee.EmNO "

call   GetPage_RSDT(sqlPS,con,intListCount, "PageControl ", "EmID ", "frmList ",rsPS)
'|ResultPageRS(Sql串,连接,每页行数,页号,过滤字段,表单名,)
  function   GetPage_RSDT(strSqlText,objConn,intPageSize,PageControl,KeyID,   strFormName,   Ref_RS)
  set   Rsdt=Server.CreateObject( "ADODB.Recordset ")
if   IsNumeric(PageControl)   then
intPageIndex   =   PageControl
CurrentPage   =   "PageControl "
else
CurrentPage   =   PageControl
intPageIndex   =   Trim(Request(PageControl))
if   IsNumeric(intPageIndex)   then
if   intPageIndex   <=   0   then   intPageIndex   =   1
else
intPageIndex   =   1
end   if
end   if

dim   strSql,strPageOut,intAll,intNot,intPos,intOrder,intWhere

RsTotalCount   =   dbCount(strSqlText,objConn)

strSql   =   Trim(strSqlText)
intPos_Select   =   instr(1,strSql, "select ",1)   +   6
'response.Write(Left(strSql,6))   &   "| <BR> "
'response.Write(Left(strSql,7))   &   "| <BR> "
'response.Write( "| "&   mid(strSql,7))   &   "| <BR> "
'response.Write( "| "&   mid(strSql,8))   &   "| <BR> "
'response.End  
strSql_1   =   Left(strSql,intPos_Select) '|取出   select
strSql_2   =   Mid(strSql,intPos_Select+1) '|取出   select   之后的内容

 

intPos   =   InStr(UCase(strSql_2), "   FROM   ") '|取出表单
intWhere   =   InStr(UCase(strSql_2), "   WHERE   ") '|取出条件
intOrder   =   InStr(UCase(strSql_2), "   ORDER   ") '|取出排序   Sql_7

strSql_6   =   left(strSql_2,intOrder)
if   intOrder   >   0   then  
strSql_7   =   mid(strSql_2,intOrder)
strSql_2   =   strSql_6
end   if
'|Response.Write(strSql_7   &   " <hr> ")  
if   intWhere   >   0   then
strSql_2   =   left(strSql_2,intWhere+6)   &   "( "   &   mid(strSql_2,intWhere+7)   &   ") " '|重载变量
end   if

intAll   =   cint(intPageIndex)   *   cint(intPageSize)
intNot   =   cint(intPageIndex   -   1)   *   cint(intPageSize)

strSql_3   =   "   Top   "   &   cint(intPageSize)   &   "   "
strSql_4   =   "   Top   "   &   intNot   &   "   "

if   intWhere   >   0   then
strSql_5   =   "   AND   (( "   &   KeyID   &   "   NOT   IN   ( "   &   strSql_1   &   strSql_4   &   "   "   &   KeyID   &   "   "   &   mid(strSql_2,intPos)   &   "   "   &   strSql_7   &   "))) "
else
strSql_5   =   "   WHERE   (( "   &   KeyID   &   "   NOT   IN   ( "   &   strSql_1   &   strSql_4   &   "   "   &   KeyID   &   "   "   &   mid(strSql_2,intPos)   &   "   "   &   strSql_7   &   "))) "
end   if

'response.Write(strSql_1   &   " <hr> ") '|select  
'response.Write(strSql_3   &   " <hr> ") '|Top   4  
'response.Write(strSql_2   &   " <hr> ") '|源SQL   *   -   Where   ..
'response.Write(strSql_5   &   " <hr> ") '|附加   where
'response.Write(strSql_7   &   " <hr> ") '|Order   by

strSql   =   strSql_1     &   strSql_3   &   strSql_2   &   strSql_5   &   strSql_7
'|   Response.Write(strSql) '|   "SELECT   TOP   9   *   FROM   Manager   WHERE   (ID   NOT   IN   (SELECT   TOP   2   ID   FROM   Manager)) "
'response.Write   strSql
'||response.End

Rsdt.Open   strSql,con,1,1
if   TypeName(Ref_RS)   =   "Recordset "   then   set   Ref_RS   =   Rsdt

call   getPageControl(intPageIndex,intPageSize,RsTotalCount,strFormName,CurrentPage)
'Rsdt.Close()
'set   Rsdt   =   nothing
  End   function

'方法二

 记录集(startPage+pageSize)-记录集(startPage)
我没有用IN,是觉得这样性能可能高些.

declare   @pagesize   int
declare   @startpage   int
declare   @sql   varchar(4000)
set   @startpage=30
set   @pagesize=10

set   @sql= 'select   ee.*   from   (select   top   '+   convert(varchar,@pagesize+@startpage)   + '   aa.*   from   t4   aa)   ee   where  
not   exists(select   ff.*   from   (select   top   '+convert(varchar,@startpage)   + '   bb.SID   from   t4   bb)   ff   where   ee.SID=ff.SID) '

exec(@sql)

'方法三

高效的分页存储过程  
摘自CSDN

CREATE   PROCEDURE   PAGINATION

@tblName       varchar(255),              

@strGetFields   varchar(1000)   =   '* ',    

@fldName   varchar(255)= ' ',          

@PageSize       int   =   10,              

@PageIndex     int   =   1,              

@doCount     bit   =   0,    

@OrderType   bit   =   0,    

@strWhere     varchar(1500)   =   ' '    

AS

declare   @strSQL       varchar(5000)            

declare   @strTmp       varchar(110)              

declare   @strOrder   varchar(400)              

if   @doCount   !=   0

    begin

        if   @strWhere   != ' '

        set   @strSQL   =   'select   count(*)   as   Total   from   [ '   +   @tblName   +   ']   where   '+@strWhere

        else

        set   @strSQL   =   'select   count(*)   as   Total   from   [ '   +   @tblName   +   '] '

end    

else

begin

 

if   @OrderType   !=   0

begin

        set   @strTmp   =   ' <(select   min '

        set   @strOrder   =   '   order   by   [ '   +   @fldName   + ']   desc '

end

else

begin

        set   @strTmp   =   '> (select   max '

        set   @strOrder   =   '   order   by   [ '   +   @fldName   + ']   asc '

end

 

if   @PageIndex   =   1

begin

        if   @strWhere   !=   ' '      

        set   @strSQL   =   'select   top   '   +   str(@PageSize)   + '   '+@strGetFields+   '     from   [ '   +   @tblName   +   ']   where   '   +   @strWhere   +   '   '   +   @strOrder

          else

          set   @strSQL   =   'select   top   '   +   str(@PageSize)   + '   '+@strGetFields+   '     from   [ '+   @tblName   +   ']   '+   @strOrder

end

else

begin

set   @strSQL   =   'select   top   '   +   str(@PageSize)   + '   '+@strGetFields+   '     from   [ '

        +   @tblName   +   ']   where   [ '   +   @fldName   +   '] '   +   @strTmp   +   '([ '+   @fldName   +   '])   from   (select   top   '   +   str((@PageIndex-1)*@PageSize)   +   '   [ '+   @fldName   +   ']   from   [ '   +   @tblName   +   '] '   +   @strOrder   +   ')   as   tblTmp) '+   @strOrder

 

if   @strWhere   !=   ' '

        set   @strSQL   =   'select   top   '   +   str(@PageSize)   + '   '+@strGetFields+   '     from   [ '

                +   @tblName   +   ']   where   [ '   +   @fldName   +   '] '   +   @strTmp   +   '([ '

                +   @fldName   +   '])   from   (select   top   '   +   str((@PageIndex-1)*@PageSize)   +   '   [ '

                +   @fldName   +   ']   from   [ '   +   @tblName   +   ']   where   '   +   @strWhere   +   '   '

                +   @strOrder   +   ')   as   tblTmp)   and   '   +   @strWhere   +   '   '   +   @strOrder

end  

end      

exec   (@strSQL)

GO

时间: 2024-09-07 21:55:39

asp存储过程高效的动态查询结果的数据库分页三种方法的相关文章

动态加载js文件的三种方法

<script language="网页特效"> function importfn(){  var head = document.getelementsbytagname("head")[0];  var script = document.createelement('script');  script.id = 'sid';  script.type = 'text/javascript';  script.src = '../js/alertt

动态加载JS文件的三种方法_javascript技巧

直接看实例.例1 重新加载js文件 复制代码 代码如下: function loadJs(file) {            var head = $("head").remove("script[role='reload']");            $("<scri" + "pt>" + "</scr" + "ipt>").attr({ role: 're

ASP.NET中把对象序列化成JSON字符串的三种方法

//方法1 //using System.Runtime.Serialization.Json; //using System.IO; //using System.Text; //using System.Text.RegularExpressions; DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(arr.GetType()); MemoryStream ms = new MemorySt

用ASP技术得到主页被访问次数的三种方法

访问 用ASP技术得到主页被访问次数的三种方法             华中理工大学自动控制工程系  周茜 田忠和    ASP 是Microsoft Active Server Pages 的缩写,即动态服务器主页. 它是服务器端脚本编写环境,在Web服务器上解释脚本,可以组合HTML页.脚本命令和ActiveX组件来创建动态.交互式.高效率的 Web 页和基于 Web 的功能强大的服务器应用程序.ASP 可以在Microsoft 的任何 Web服务器上发布各种动态数据,而且ASP应用程序很容

动态改变EnterpriseLibary数据库访问链接字符串的三种方法

使用EnterpriseLibary做数据库访问底层是我一贯的做法,除了其能兼容多种数据库,且使用其进行数据库访问,对各种数据库操作均是透明的,基本不需要对特定的数据库进行操作,编写一次操作代码,基本在各种数据库都适用.对于一些特殊的数据库,很多同行已经编写出各种各样的扩展类库,直接适用即可. 言归正传,动态改变EnterpriseLibary数据库访问链接字符串一般在使用Access数据库.Sqlite数据库等文件式的数据库比较常见,因为我们不知道客户会把程序拷贝到哪里进行使用(即使是做了安装

asp.net中显示DataGrid控件列序号的几种方法

asp.net|datagrid|datagrid控件|显示 asp.net中显示DataGrid控件列序号的几种方法 作者:郑佐 2004-9-10 在aps.net中多数据绑定的控件很多,论功能来说,应该属DataGrid最为齐全,但它没有提供现成的显示记录序号的功能,不过我们可以通过它所带的一些参数来间接得到序号,下面来看看怎样得到和显示序号值计算方式如下: (1)在后台 DataGrid.CurrentPageIndex * DataGrid.PageSize + e.Item.Item

在Hibernate里面动态切换SChema实现访问不同的数据库的几种方法

需求很简单,相同的操作,比如表结构完全相同,程序也完全相同,但需要根据某些条件,分别向不同的schema做操作. 比如,如果当前处理的是A公司,那么向SchemaA 里面保存数据,如果当前处理的是B公司的,则向SchemaB里面保存数据. 其实就是一套程序,实现后台的动态切换. 我这里提供几种方法,大家自己根据情况考虑,都能实现,注意是实现,不一定适合于正式应用. 方法一: 在Hibernate里面,有一个配置参数,比如下面这个带Schema配置的映射 <?xml version="1.0

asp.net读取excel文件的三种方法示例

 这篇文章主要介绍了asp.net读取excel文件的三种方法示例,包括采用OleDB读取Excel文件.引用的com组件读取Excel文件.用文件流读取,需要的朋友可以参考下 方法一:采用OleDB读取Excel文件   把Excel文件当做一个数据源来进行数据的读取操作,实例如下:  代码如下: public DataSet ExcelToDS(string Path)    {    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;&q

jquery动态加载js三种方法

 <!-- 这里为你提供了三种动态加载js的jquery实例代码哦,由于jquery是为用户提供方便的,所以利用jquery动态加载文件只要一句话$.getscript("test.js");就ok了. <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd&qu