MS-SQL 分页函数+ASP

本文介绍了一个用于MS-SQL分页查询的存储过程,该存储过程接受参数如页码、页大小、主键、查询列、表名和查询条件,生成SQL语句以实现分页效果。此外,还提供了无查询条件时的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

共需要两个存储过程,第一个是负责分页的

  1. CREATE PROCEDURE [dbo].[USP_GetList] 
  2. (
  3.  @pageIndex int = 1 -- 当前页码0 表示返回所有符合内容
  4. ,@pageSize int = 10 -- 页尺寸
  5. ,@SID nvarchar(30) = '' -- 主键字段
  6. ,@strGetField nvarchar(1000) = '*' -- 需要返回的列
  7. ,@strTableName nvarchar(30) = '' --表名    
  8. ,@strWhere nvarchar(2000) = '' -- 查询条件(注意: 条件中要带where)
  9. ,@strOrderBy nvarchar(300) = '' -- 排序  
  10. --,@MemberID int=0 --会员ID
  11. )
  12. AS
  13. SET NOCOUNT ON
  14. DECLARE @strSQL nvarchar(4000)
  15. DECLARE @startPos int
  16. DECLARE @endPos int
  17. DECLARE @num int
  18. SET @startPos=@pageSize*(@pageIndex-1)+1
  19. SET @endPos=@startPos+@pageSize-1
  20. --页大小*(页数-1)
  21. SET @num = @pageSize * (@PageIndex - 1)
  22. IF @PageIndex!=0
  23.     BEGIN
  24.         IF @strWhere != ''
  25.             SET @strSQL = 'SELECT TOP '+ cast(@pageSize as nvarchar(10)) +' '+ @strGetField +' FROM '+ @strTableName +' WHERE ('+ cast(@SID as nvarchar(30)) +' NOT IN (SELECT TOP '+ cast(@num as nvarchar(20)) +' '+ cast(@SID as nvarchar(30)) +' FROM '+ @strTableName +' where '+@strWhere+' ORDER BY '+ cast(@strOrderBy as nvarchar(255)) +' )) and '+@strwhere+' ORDER BY '+cast(@strOrderBy as varchar(255)) + ''
  26.         else
  27.             SET @strSQL = 'SELECT TOP '+ cast(@pageSize as nvarchar(10)) +' '+ @strGetField +' FROM '+ @strTableName +' WHERE ('+ cast(@SID as nvarchar(30)) +' NOT IN (SELECT TOP '+ cast(@num as nvarchar(20)) +' '+ cast(@SID as nvarchar(30)) +' FROM '+ @strTableName +' ORDER BY '+ cast(@strOrderBy as nvarchar(255)) +' )) ORDER BY '+ cast(@strOrderBy as varchar(255)) + ''
  28.       --SET @strSQL = 'SELECT TOP 页大小 *  FROM Users  WHERE (ID  NOT IN (SELECT TOP (页大小*(当前页-1)) ID FROM Users   ORDER BY ID DESC )) ORDER BY ID DESC'
  29.     END
  30. ELSE
  31.     BEGIN
  32.         IF @strWhere != ''
  33.             SET @strSQL = 'select '+ @strGetField +' from  ' + @strTableName + ' where '+ @strWhere +' order by '+ @strOrderBy
  34.         ELSE
  35.             SET @strSQL = 'select '+ @strGetField +' from  ' + @strTableName + ' order by '+ @strOrderBy
  36.     END
  37. --print(@strSQL)
  38. EXEC(@strSQL)
  39. GO

第二个存储过程

 

  1. CREATE PROCEDURE [dbo].[USP_GetTotal]
  2. (
  3.     @strTableName nvarchar(30) = '',
  4.     @strWhere nvarchar(2000) = '' -- 查询条件(注意: 条件中要带where)
  5. )
  6. AS
  7. SET NOCOUNT OFF
  8. DECLARE @strSQL nvarchar(2500)
  9. IF @strWhere != ''
  10.     SET @strSQL = 'select count(*) as Total from ['+ @strTableName +'] where '+ @strWhere
  11. ELSE
  12.     SET @strSQL = 'select count(*) as Total from ['+ @strTableName +']'
  13. EXEC(@strSQL)
  14. GO

 

下面是调用这个存储过程的两个函数。可以放到一个包含文件里

,注意,下面的函数里面使用的一些变量,是全局的变量,不是参数传入的,所以需要在调用函数钱,给全局变量赋值。

 

  1. <%
  2. '取记录总数存储过程
  3. public function getDataRowCount(strTableName, strWhere)
  4.     dim maxCount
  5.     dim myobj
  6.     dim rsCount
  7.     maxCount = 0
  8.     Set myobj = Server.CreateObject("ADODB.Command")
  9.     with myobj
  10.        .ActiveConnection = conn
  11.        .CommandText      = "USP_GetTotal"
  12.        .CommandType      = 4
  13.        .Prepared         = true
  14.        .Parameters.append .CreateParameter("@strTableName", 200, 1, 30, strTableName)
  15.        .Parameters.append .CreateParameter("@strWhere", 200, 1, 2000, strWhere)
  16.        Set rsCount = .Execute
  17.     end with
  18.     Set myobj = Nothing
  19.     maxCount = rsCount("Total")
  20.     rsCount.close:Set rsCount = Nothing
  21.     getDataRowCount = maxCount 
  22. end function
  23. '单表分页存储过程
  24. sub getDataRS()
  25.     dim obj
  26.     Set obj = Server.CreateObject("ADODB.Command")
  27.     with obj
  28.         .ActiveConnection = conn 
  29.         .CommandText      = "USP_GetList"
  30.         .CommandType      = 4
  31.         .Prepared         = true
  32.         .Parameters.append .CreateParameter("@pageIndex", 3, 1, 4, iPageIndex)
  33.         .Parameters.append .CreateParameter("@pageSize", 3, 1, 4, iPageSize)
  34.         .Parameters.append .CreateParameter("@SID", 200, 1, 30, SID) ' 2000
  35.         .Parameters.append .CreateParameter("@strGetField", 200, 1, 1000, strGetField)
  36.         .Parameters.append .CreateParameter("@tableName", 200, 1, 30, strTableName)
  37.         .Parameters.append .CreateParameter("@strWhere", 200, 1, 2000, strWhere)
  38.         .Parameters.append .CreateParameter("@strOrderBy", 200, 1, 300, strOrderBy)
  39.         Set rstobj = .Execute
  40.     end with
  41.     Set obj = Nothing
  42. end sub
  43. %>

 

 

下面是调用这组分页存储过程的实例

 

 

  1. '#############定义分页存储过程所要使用的变量##################################################
  2.     '1.定义变量,给部分变量设定初始值
  3.         dim iPageIndex, iPageSize, iRowCount
  4.         dim strWherem, strTableName, SID, strGetField, strWhere, strOrderBy
  5.         iPageSize = 12                                      '一页内显示的记录条数
  6.         strTableName = "dataTable"    '表名
  7.         SID = "id"                                              '主键名
  8.         strGetField = "id, field1,field2,field3"
  9.                                                                             '要显示的字段名
  10.         strWhere = "where1=1 and where2=2"           
  11.                                                                             'where子句
  12.         strOrderBy = "id desc"                      '排序         
  13.         
  14.     '2,执行getPageInf() 得到(1)iPageIndex:当前页数,(2)iRowCount:总记录数,(3)iPageCount:总页数
  15.         Call getPageInfo()   'include_gb/page.asp
  16.         
  17.     '3,先定义rsTobj,再执行getDataRS().sub getDataRS()使用上面定义的表明,字段,where,页数,总记录数语句等,去访问存储过程,并把结果付给rsTobj(集合)
  18.         dim rsTobj
  19.         Call getDataRS()
  20.     '4,rsTobj得到了返回数据,开始循环输出,写到过程里,方便调用
  21.         sub showProducts()
  22.             if rsTobj.eof Then
  23.                 response.Write("暂时没有数据")
  24.             else    
  25.                 do while not rsTobj.eof 
  26.                     Call showProdTable(rsTobj("id"),rsTobj("NewsName"),rsTobj("Pictures"),rsTobj("abstract"), rsTobj("AddTime"))
  27.                 rsTobj.moveNext
  28.                 loop
  29.             end if
  30.             CloseRS(rsTobj) '关闭链接 include_gb/connSiteData.asp
  31.         end sub
  32. '###############################################################
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值