标题: [SQLServer] sql 存储过程分页技术的问题 (查看:347 回复:1)
玥珑晗
学徒网管




UID 779251
精华 0
积分 5
帖子 1
MST币 15 点    
BST币 5 点    赚取
阅读权限 60
注册 2008-8-8
状态 离线
 
[ 使用道具 ]  
发表于 2008-8-8 11:18  [ 资料 ]  [ 博客 ]  [ 短消息 ]  [ 加为好友
爱琴思邮件系统iGENUS V5.0
sql 存储过程分页技术的问题
本帖发表在我是网管论坛,帖子地址:http://bbs.54master.com/265292,1,1
我的sql存储过程代码
create procedure dbo.PagePROC
(
@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
然后是asp调用
set recom = server.createobject("adodb.command")
recom.activeconnection = StrDSN
recom.commandtype = 4
recom.CommandTimeout = 0
recom.Prepared = true
recom.commandtext = "dbo.PagePROC"
recom.Parameters.Append recom.CreateParameter("@TblName",202,1,100,"testttl")
recom.Parameters.Append recom.CreateParameter("@ID",202,1,20,"id")
recom.Parameters.Append recom.CreateParameter("@FldName",202,1,100,"id,ttl,tdate")
recom.Parameters.Append recom.CreateParameter("@StrWhere",202,1,200,"")
recom.Parameters.Append recom.CreateParameter("@OrderType",3,1,1,0)
recom.Parameters.Append recom.CreateParameter("@PageSize",3,1,6,10)
recom.Parameters.Append recom.CreateParameter("@CurrentPage",3,1,6, Clng(Request("PageNo")))
'这里给要参数传值
TblName="testttl"   '表名
id="id"   '主键名
FldName="id,ttl,tdate"   '要显示的列名
StrWhere=""   '条件可以自己写,如:firstName=‘johnny’
OrderType=0 '0为升,1为降
PageSizeX = 10
PageNo = Clng(Request("PageNo"))'int最大值只有到32767.
If PageNo<=0 or PageNo="" Then    PageNo=1
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")&" 标题:"&rs("ttl")&"  | 更新时间: "&rs("tdate")&"<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
我调试之后总是显示Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e14'

[Microsoft][ODBC SQL Server Driver][SQL Server]第 1 行: '-' 附近有语法错误。

/test/admin.asp,行 36
可以帮我看看那里有错吗
谢谢各位了!!!!

[ 点这里复制网址,推荐给你QQ/MSN上的好友们! ]
本站声明:以上内容由网友 玥珑晗 提供,与54master立场无关!
[ 顶部 ]
域名、虚拟主机、服务器租用/托管一站式IT服务 V5.0
DVD
中级网管

数据库技术


光荣退伍  
UID 183991
精华 5
积分 569
帖子 3151
MST币 10721 点    
BST币 569 点    赚取
阅读权限 100
注册 2005-4-11
来自 IT鸟语学院
状态 离线
 
[ 使用道具 ]  
发表于 2008-8-9 21:48  [ 资料 ]  [ 博客 ]  [ 主页 ] [ 短消息 ]  [ 加为好友
解决方法:

通过事件探查器,看看执行的代码是什么,再拿执行的代码到查询分析器上执行,看问题出现哪一行。

本站声明:以上内容由网友 DVD 提供,与54master立场无关!
《我是网管》论坛
No incapable except unthinkable
my blog : DVD的博客
  MSN:weiguohao008@hotmail.com



--
[ 顶部 ]
  
 



当前时区 GMT+8, 现在时间是 2008-12-3 13:18

Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.058513 second(s), 12 queries , Gzip enabled

清除 Cookies - 关于我是网管 - 联系我是网管 - 广告服务 - 诚聘版主 - 无图版 - WAP -