A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

sql server 关于分页一直都不能令人满意。对于少量数据来说不算什么,但是数据量一大,问题立马出现。慢慢的效率,看起来就让人不爽。但是自从sql server 2005以来增加ROW_NUMBER()函数,给大家带了曙光。就这个函数我写了个方言,以后自定义分页时用得到。经过测试此方言对于一般的sql语句,和带order by的语句支持较好。但是对于复杂点的复合语句还是不行。不过这个相对于,以前的top已经是很不错了。[code=java]        public String getLimitString(String sql, int offset, int limit) {  
                // offset 第几页    limit   每页个数   
                sql=trim(sql);
                int length=sql.length();
                int subIndex=sql.indexOf(" from");
                int subIndexOrder=sql.indexOf("order by");
                StringBuffer sb=new StringBuffer(length);
                sb.append("With Tb AS(").append(sql.substring(0, subIndex)).append(",ROW_NUMBER() OVER (");
                if(subIndexOrder!=-1){
                        sb.append(sql.substring(subIndexOrder, length)).append(")as RN")
                        .append(sql.substring(subIndex, subIndexOrder));
                }else{
                        sb.append("order by (select 0))as RN").append(sql.substring(subIndex, length));                       
                }
                sb.append(")select * from Tb Where RN Between ").append((offset-1)*limit+1).append(" and ")
                        .append(limit*offset).append(SQL_END_DELIMITER);
                return sb.toString();  
        }  [/code]注:ibatis和hibernate中关于sql server的分页一直都是假分页 !要想提高效率必须自定义方言,重写它们固有的方法。

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马