注:SQL Server分页查询的SQL来源于:http://blog.csdn.net/qiaqia609/article/details/41445233
后根据项目需要,做过一定的修改。
1、用到的分页存储过程:
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go --分页存储过程 CREATE PROCEDURE [dbo].[sp_Paging] ( @Tables nvarchar(1000), --表名/视图名 @PrimaryKey nvarchar(100), --主键 @Sort nvarchar(200) = NULL, --排序字段(不带order by) @pageindex int = 1, --当前页码 @PageSize int = 10, --每页记录数 @Fields nvarchar(1000) = N'*', --输出字段 @Filter nvarchar(1000) = NULL, --where过滤条件(不带where) @Group nvarchar(1000) = NULL --Group语句(不带Group By) ) AS DECLARE @SortTable nvarchar(100) DECLARE @SortName nvarchar(100) DECLARE @strSortColumn nvarchar(200) DECLARE @operator char(2) DECLARE @type nvarchar(100) DECLARE @prec int --设定排序语句 IF @Sort IS NULL OR @Sort = '' SET @Sort = @PrimaryKey IF CHARINDEX('DESC',@Sort)>0 BEGIN SET @strSortColumn = REPLACE(@Sort, 'DESC', '') SET @operator = '<=' END ELSE BEGIN SET @strSortColumn = REPLACE(@Sort, 'ASC', '') SET @operator = '>=' END IF CHARINDEX('.', @strSortColumn) > 0 BEGIN SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn)) SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn)) END ELSE BEGIN SET @SortTable = @Tables SET @SortName = @strSortColumn END --设置排序字段类型和精度 SELECT @type=t.name, @prec=c.prec FROM sysobjects o JOIN syscolumns c on o.id=c.id JOIN systypes t on c.xusertype=t.xusertype WHERE o.name = @SortTable AND c.name = @SortName IF CHARINDEX('char', @type) > 0 SET @type = @type + '(' + CAST(@prec AS varchar) + ')' DECLARE @strPageSize nvarchar(50) DECLARE @strStartRow nvarchar(50) DECLARE @strFilter nvarchar(1000) DECLARE @strSimpleFilter nvarchar(1000) DECLARE @strGroup nvarchar(1000) IF @pageindex <1 SET @pageindex = 1 SET @strPageSize = CAST(@PageSize AS nvarchar(50)) --设置开始分页记录数 SET @strStartRow = CAST(((@pageindex - 1)*@PageSize + 1) AS nvarchar(50)) --筛选以及分组语句 IF @Filter IS NOT NULL AND @Filter != '' BEGIN SET @strFilter = ' WHERE ' + @Filter + ' ' SET @strSimpleFilter = ' AND ' + @Filter + ' ' END ELSE BEGIN SET @strSimpleFilter = '' SET @strFilter = '' SET @strGroup=''; END IF @Group IS NOT NULL AND @Group != '' SET @strGroup = ' GROUP BY '+@Group; /* --计算总记录数 DECLARE @TotalCountSql nvarchar(1000) SET @TotalCountSql=N'SELECT @TotalCount=COUNT(*)' +N' FROM ' + @Tables + @strFilter EXEC sp_executesql @TotalCountSql,N'@TotalCount int OUTPUT',@TotalCount OUTPUT */ --执行查询语句 declare @sql varchar(2000); declare @sql2 varchar(1000); declare @sql3 varchar(1000); declare @sql4 varchar(1000); declare @sql5 varchar(1000); set @sql = 'DECLARE @SortColumn ' + @type+';'; set @sql2 = 'SET ROWCOUNT ' + @strStartRow+';'; /* print '@strSortColumn='+@strSortColumn; print '@Tables:'+@Tables; print '@strFilter:'+@strFilter; print '@strGroup:'; print '@Sort:'+@Sort; */ set @sql3='SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ORDER BY ' + @Sort+';'; set @sql4='SET ROWCOUNT ' + @strPageSize+';'; set @sql5='SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ORDER BY ' + @Sort + ''+';'; /* print 'sql:'+@sql; print 'sql2:'+@sql2; print 'sql3:'+@sql3; print 'sql4:'+@sql4; print 'sql5:'+@sql5; */ set @sql = @sql+@sql2+@sql3+@sql4+@sql5; print @sql; EXEC(@sql)
2、使用Java进行调用:
/** * 该方法用来加载基础数据 * @param userID:当前登陆人登陆ID,若为0表示加载全部 * @param curPage:当前为多少页 * @param pageSize:每页显示数量 * @param sort:排序 1-默认按照ID顺序排 2-日期 3-地区 * @param area:地区 * @param startTime:开始时间 * @param endTime:结束时间 * @return List<Table2>:当前登陆人的全部基础信息 * **/ public List<Table2> loadBaseInfo(String userID,int curPage,int pageSize, String sort,String area,String startTime,String endTime){ int u_id = 0; try{ u_id = Integer.parseInt(userID); }catch(Exception e){ return null; } List<Table2> table2List = null; StringBuffer sql = new StringBuffer(); StringBuffer where = new StringBuffer(); //地区不为空 且 日期在去年12月到今年的数据 where.append("len(field97)>0 and (year(field98)=year(getDate()) or (year(field98)=(year(getDate())-1) and month(field98)=12))"); if(u_id>0){//获取当前人的数据 where.append(" and field19="+userID); } //排序 String orderBy = "field1 desc"; int order = Integer.parseInt(sort); switch(order){ case 2:orderBy="field24 desc";break; case 3:orderBy="field97 asc";break; default:break; } //地区 if(area!=null && area.trim().length()>0){ where.append(" and field97 like ''%"+area+"%''"); } //时间 if(startTime!=null && startTime.trim().length()>0 && endTime!=null && endTime.trim().length()>0){ startTime = startTime+" 00:00:00.000"; endTime = endTime + " 23:59:59.000"; where.append(" and field7 between ''"+startTime+"'' and ''"+endTime+"'' "); } int size=0; try{ //判断是否要返回总数 if(curPage==1){//说明是第一页,那么需要返回总页数 //replaceAll方法处理拼接like和between时特意添加的两个单引号'',因为若是用一个单引号,调用分页查询的存储过程时会出现问题。此处若不处理,SQL必然报错。 sql.append("select count(field1) from Table2 where "+where.toString().replaceAll("''", "'")); size = execCountSQL(sql.toString()); if(size<=0){//没有总数,那么不需要再往下查询了 //写日志 writeLoggerForSQL("根据登录人序号(序号:"+userID+",若为0表示加载全部)获取基础信息", sql.toString(),0+""); return null; } } table2List = new ArrayList<Table2>(); Table2 t2 = null; sql.delete(0,sql.length()); sql.append(getPagingSQL("table2", "field1", orderBy, curPage, pageSize, "*", where.toString(), null)); System.out.println("第"+curPage+"页;执行的SQL:"+sql); ResultSet rs = execQuery(sql.toString()); while(rs.next()){ t2 = new Table2( rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4) ); table2List.add(t2); } if(curPage==1){ table2List.add(new Table2(curPage,pageSize,size)); } //写日志 writeLoggerForSQL("根据登录人序号(序号:"+userID+",若为0表示加载全部)获取基础信息", sql.toString(),((table2List!=null && table2List.size()>0)?table2List.size():0)+""); }catch(Exception e){ //将异常信息写入日志文件 writeLoggerForException("根据登录人序号(序号:"+userID+",若为0表示加载全部)获取基础信息", sql.toString(), e); e.printStackTrace(); } return table2List; } /** * 该方法用来拼接使用存储过程进行分页的SQL语句, * 其中tableName、primaryKey两个不能为空 * @param tableName:表名称 * @param primaryKey:主键字段 * @param Sort:排序字段,不需要传order by关键字,默认使用主键顺序排列 * @param pageIndex:当前页 * @param pageSize:每页显示数量 * @param fields:查询字段,默认为* * @param filter:查询条件,不需要传where关键字 * @param group:分组字段,不需要传group by关键字 * @param * **/ private String getPagingSQL(String tableName,String primaryKey,String sort, int pageIndex,int pageSize,String fields,String filter,String group){ //表名称和主键名称不能为空 if(tableName==null || tableName.trim().length()<=0 || primaryKey==null || primaryKey.trim().length()<=0){return null;} //为其他添加默认值 if(sort==null || sort.trim().length()<=0){sort="NULL";}else{sort="'"+sort+"'";} if(pageIndex<=0){pageIndex=1;} if(pageSize<=0){pageSize=5;} if(fields==null || fields.trim().length()<=0){fields="*";} if(filter==null || filter.trim().length()<=0){filter="NULL";}else{filter="'"+filter+"'";} if(group==null || group.trim().length()<=0){group="NULL";}else{group="'"+group+"'";} StringBuffer sql = new StringBuffer(); sql.append("DECLARE @return_value int;") .append("EXEC @return_value = [dbo].[sp_Paging] ") .append("@Tables = N'"+tableName+"',") .append("@PrimaryKey = N'"+primaryKey+"',") .append("@Sort = "+sort+",") .append("@pageindex = "+pageIndex+",") .append("@PageSize = "+pageSize+",") .append("@Fields = '"+fields+"',") .append("@Filter = "+filter+",") .append("@Group = "+group+""); return sql.toString(); }
相关推荐
sqlserver分页查询语句;sqlserver分页查询语句;sqlserver分页查询语句;
sql server2005 分页查询语句
mybatis中,sqlserver分页
java 连接sqlserver数据库查询,并分页显示
sql server分页代码 --分页【top】:不支持复合主键 SELECT TOP 10 * from Lend where id not in (SELECT TOP ((2-1)*10) id from lend ORDER BY id) ORDER BY id ; SELECT TOP 10 * from Lend where id not ...
SQLServer数据库的分页查询,比较全面。
通常多表联查并且数据大时,分页查询时,会出现查询性能问题,查分页后面的数据,时间越久。但我们可以通过判断查询数据的总数据来进行相应的查询方式,从而保证性能。
mysql,oracle,sqlserver分页
sqlserver分页sql
sqlserver2008不支持关键字limit ,所以它的分页sql查询语句将不能用MySQL的方式进行,幸好sqlserver2008提供了top,rownumber等关键字,这样就能通过这几个关键字实现分页。 下面是本人在网上查阅到的几种查询脚本...
sql server分页技术 详解 sql server分页技术 详解 sql server分页技术 详解
sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程
关于SQL Server SQL语句查询分页数据的解决方案
SQL server2008中通用分页存储过程,表名,每页长度,页码都是动态赋值。
这里有两个分页查询的例子,很好看懂,所以没有写注释
sql server 分页大全, 分页存储过程,分页TSQL , 分页语法,语句! 最全的SQL Server2000 分页方法。 可放心下载
java语言编写的分页功能。很实用的查询功能,不基于任何框架的限制。
千万级数据分页查询存储过程SQLServer 有实例
sqlserver+group by分组查询分页存储过程
Sqlserver数据库分页查询一直是Sqlserver的短板,分页查询每页30条,查询第1500页(即第45001-45030条数据)进行测试,分析出最高效的查询,感兴趣的朋友可以参考下哈