以前做分页一直是在页面程序里执行,最近发现效率比较低,想转为存储过程。在网上找了一下,自已也调试了。现在想高手指点点,还有一点我们没有调试过去。不知道为个在效率上和邹老大的分页存储过程那个效率过些。
我对这个一点都不能,希望高手给些意见CREATE PROCEDURE infopagelist
@currentpage int,@keyword varchar(100)
asSET NOCOUNT ON
Declare @p1 int,@rowcount int,@pagesize int,@sqlstr varchar(1000)
set  @pagesize=40
set @sqlstr='select id,title from T_info'
if @keyword!='' begin
set @sqlstr=@sqlstr+' where title like ''%@keyword%''' 
end
set @sqlstr=@sqlstr+' order by id desc' exec sp_cursoropen @p1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output 
select ceiling(1.0*@rowcount/@pagesize) as totalpage
set @currentpage=(@currentpage-1)*@pagesize+1 
exec sp_cursorfetch @p1,16,@currentpage,@pagesize 
exec sp_cursorclose @p1 
set nocount off
GO
--set @sqlstr=@sqlstr+' where title like ''%@keyword%''' 这个加了查询条件,就查不到记录。数据库里是有的。另外这个模糊查询是否影响效率。我执行语句是:execute infopagelist @currentpage=1,@keyword='美丽'select id,title from T_info where title like '%美丽%' order by id desc
用语句查就有,不知道是什么原因。请高手指点指点

解决方案 »

  1.   

    set @sqlstr=@sqlstr+' where title like ''%@keyword%''' 
    ---------------------------------------------------------
    改为:
    set @sqlstr=@sqlstr+' where title like ''%' + @keyword + '%'''
      

  2.   

    set @sqlstr=@sqlstr+' where title like ''%' + @keyword + '%'''
    左边最好不要用%,着这样索引就起不了作用了!
      

  3.   

    to hellowork(一两清风) 和 mugua604(熟不了的木瓜) 两位高手
    这样的存储过程在性能方面是否比邹老大的如何,我一点都不知道。另外这个存储过程有三个输出参数,可以去掉一个,只留总页数和记录集呢
      

  4.   

    使用title like '%美丽%'这种方式是无法使用索引的,SQLSERVER必须逐行扫描.如果使用
    title like '美丽%',则可以使用title上建立的索引.
    如果不使用系统存储过程sp_cursorfetch 进行分页,则需要表上有IDENTITY标识列,然后按该标识列进行分页处理.
    有关分页存储效率请参考下面这个帖子:
    http://topic.csdn.net/t/20060805/13/4929093.html
      

  5.   

    to hellowork(一两清风)
    我看了,不是很明白。对存储过程是一知半解的。提供的文件有三种方式,第二种好象就是我这个使用的。
    现在遇到情况是该存储过程返回两个记录集,一个是空的,一个是有记录的。我不知道怎么取出来的我的程序如下:<%@ page contentType="text/html;charset=GBK" %><%@ page import="java.sql.*" %><%@ page import="comic.count" %><jsp:useBean id="count" scope="page" class="comic.count" /><%ResultSet revalue=null;
    Connection conn;
    Statement stmt;String proname="infopagelist",par="1,性";
    String call_pro_str="{call "+proname+"(";
    String[] pars=par.split(",");
    for(int i=0;i<pars.length;i++)
    {call_pro_str=call_pro_str+"?,";}
    call_pro_str=call_pro_str.substring(0,call_pro_str.length()-1);
    call_pro_str=call_pro_str+")}";conn = DriverManager.getConnection(url, user, pass);
    CallableStatement call_pro=conn.prepareCall(call_pro_str);//创建对象call_pro.setString(1,pars[0]);
    call_pro.setString(2,pars[1]);
    call_pro.executeQuery();
    revalue=call_pro.getResultSet();
    call_pro.getMoreResults();
    revalue=call_pro.executeQuery();
    call_pro.close();
    conn.close();while(revalue.next()){
    out.print(revalue.getString("id")+"<br>");
    }
    %>