首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

小弟不才,想一个存储过程分页的有关问题

2012-02-15 
小弟不才,想请教各位一个存储过程分页的问题小弟最近开发一个流量统计系统,涉及数据为千万级别,用了SQLSER

小弟不才,想请教各位一个存储过程分页的问题
小弟最近开发一个流量统计系统,涉及数据为千万级别,用了SQL   SERVER存储过程做的!现在遇到几个难题想请教各位,真心感谢!

存储过程如下(来源网上某位高手的),我自己改动了下,因为有三个条件是每次查询差不多都用到的,就一并写进去了!


CREATE   PROCEDURE   GetRecordPage
        @tblName             varchar(255),               --   表名
        @fldName             varchar(255),               --   字段名
        @PageSize           int,                       --   页尺寸
        @PageIndex         int,                         --   页码
        @OrderType         bit,                         --   设置排序类型,   非   0   值则降序
        @strWhere           varchar(2000),     --   查询条件   (注意:   不要加   where)
        @fleString             varchar(2000),       ---取出的字段
        @GetUserId     int,       --我加的参数   用户ID号
        @GetGameId   int,         --我加的参数   游戏ID号
        @GetSiteId   int           --我加的参数   站点ID号
 
AS

declare   @strSQL       varchar(6000)               --   主语句
declare   @strTmp       varchar(1000)               --   临时变量
declare   @strOrder   varchar(500)                 --   排序类型


/***以下部分是我改的
当用户ID不为空时,原始的strwhere(查询条件   不带where的)语句   连接上我加上的条件

if   @GetUserId   !=   ' '
        set   @strWhere   =   @strWhere   +     '   and   come_userid   =     '   +@GetUserId

if   @GetGameId   !=   ' '
        set   @strWhere   =   @strWhere   +     '   and   come_gameid   =     '   +@GetGameId

if   @GetSiteId   !=   ' '
        set   @strWhere   =   @strWhere   +     '   and   come_siteid   =     '   +@GetSiteId
**/


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

set   @strSQL   =   'select   top   '   +   str(@PageSize)   +   '     '   +   @fleString   +   '       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)   +   '     '+   @fleString   + '     from   [ '
                +   @tblName   +   ']   where   [ '   +   @fldName   +   '] '   +   @strTmp   +   '([ '
                +   @fldName   +   '])   from   (select   top   '   +   str((@PageIndex-1)*@PageSize)   +   '   [ '
                +   @fldName   +   ']   from   [ '   +   @tblName   +   ']   where   '   +   @strWhere   +   '   '
                +   @strOrder   +   ')   as   tblTmp)   and   '   +   @strWhere   +   '   '   +   @strOrder

if   @PageIndex   =   1
begin
        set   @strTmp   =   ' '
        if   @strWhere   !=   ' '
                set   @strTmp   =   '   where   ( '   +   @strWhere   +   ') '

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

exec   (@strSQL)
GO


asp里调试的代码如下:

<!--CONN文件等-->
<%dim   page
if   request.querystring( "page ")   =   " "   then
page   =1
else
page   =   request.QueryString( "page ")
end   if

CreateConn   Conn   '连接了库

Set   cmd   =   Server.CreateObject( "ADODB.Command ")
cmd.ActiveConnection   =   Conn               '数据库连接字串
cmd.CommandText   =   "GetRecordPage "             '指定存储过程名
cmd.CommandType   =   4                   '表明这是一个存储过程
cmd.Prepared   =   true                   '要求将SQL命令先行编译

cmd.Parameters.append   cmd.CreateParameter( "@tblName ",200,1,50, "IPtable "   )


cmd.Parameters.append   cmd.CreateParameter( "@fldName ",200,1,50, "ID ")
cmd.Parameters.append   cmd.CreateParameter( "@PageSize ",3,1,4,20)
cmd.Parameters.append   cmd.CreateParameter( "@PageIndex ",3,1,4,page)
cmd.Parameters.append   cmd.CreateParameter( "@OrderType ",3,1,4,1)
cmd.Parameters.append   cmd.CreateParameter( "@strWhere ",200,1,800, "Id   <>   0   ")   '查询条件where   中的条件语句
cmd.Parameters.append   cmd.CreateParameter( "@fleString ",200,1,800, "id,v_ip,v_year,v_month,v_day,v_time,v_osinfo,(select   top   1   gamesname   from   gametable   where   id   =   IPtable.come_gameid)   as   come_gamename,(select     top   1   name   from   sitetable   where   id   =   CE_IPCount.come_siteid   and   userid   =   IPtable.come_userid)   as   come_sitename,pvcount ")  
cmd.Parameters.append   cmd.CreateParameter( "@GetUserId ",3,1,4,session( "uid "))
cmd.Parameters.append   cmd.CreateParameter( "@GetGameId ",3,1,4,0)
cmd.Parameters.append   cmd.CreateParameter( "@GetSiteId ",3,1,4,0)

Set   rs   =   cmd.Execute
if   rs.state   =   0   then
recordcount   =   -1
else
rs.close  
end   if
Set   cmd   =   Nothing

rs.open

for   i   =   1   to   20
Response.write   Rs(0)& "----------- "&Rs(1)& "----------- "&Rs(2)& " <br> "
rs.movenext
next
%>

现在报的错误是:
Microsoft   OLE   DB   Provider   for   ODBC   Drivers   错误   '80040e07 '  

[Microsoft][ODBC   SQL   Server   Driver][SQL   Server]将   varchar   值   'Id   <>   0   and   come_userid   =   '   转换为数据类型为   int   的列时发生语法错误。  

/test.asp,行   31  

望各位达人帮忙看看!跪谢!

[解决办法]
if @GetUserId != ' '
set @strWhere = @strWhere + ' and come_userid = ' +rtrim(@GetUserId)

if @GetGameId != ' '
set @strWhere = @strWhere + ' and come_gameid = ' +rtrim(@GetGameId)

if @GetSiteId != ' '
set @strWhere = @strWhere + ' and come_siteid = ' +rtrim(@GetSiteId)

热点排行