注: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(); }
相关推荐
### SQL Server分页查询概述 分页查询是指从大量数据中按需取出一部分数据的过程,通常用于网页展示或大型数据报表中,以提高加载速度和减少服务器负担。在SQL Server中,实现分页查询有多种方法,包括使用`ROW_...
sqlserver分页查询语句;sqlserver分页查询语句;sqlserver分页查询语句;
mybatis中,sqlserver分页
String url = "jdbc:sqlserver://localhost:1433;databaseName=myDatabase"; String username = "myUsername"; String password = "myPassword"; try { Class.forName(...
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 ...
### SQL Server 数据库分页查询方法详解 #### 一、背景与问题定义 在实际的数据库操作中,分页查询是非常常见的需求之一。对于大型数据集来说,一次加载所有数据到前端显示是不现实的,这不仅会增加服务器负担,还...
通常多表联查并且数据大时,分页查询时,会出现查询性能问题,查分页后面的数据,时间越久。但我们可以通过判断查询数据的总数据来进行相应的查询方式,从而保证性能。
本教程将详细讲解如何在Java中实现不分框架的分页查询,同时涵盖对MySQL和SQL Server数据库的支持。 一、基础知识 1. 分页概念:分页是将大量数据按一定数量分成若干部分,每次只加载一部分到内存中显示,用户可以...
3. **SQL Server分页查询** - `TOP`子句:在SQL Server中,可以使用`TOP`子句配合`ORDER BY`来实现分页。例如,获取第一页的数据,可以写成`SELECT TOP pageSize * FROM table ORDER BY sortField DESC`。 - `...
### 数据库分页技术详解:MySQL、Oracle与SQL Server #### Oracle 分页 ...例如,在Oracle中利用`ROWNUM`进行简单快速的分页处理,在SQL Server中则可以利用窗口函数实现更为灵活高效的分页查询。
首先,我们要明白SQL Server分页查询的基本思想:一次查询只返回所需页面的数据,而不是一次性获取所有数据,这样可以减少网络传输量,减轻服务器压力,并提升查询速度。在SQL Server中,通常使用`TOP`关键字结合子...
sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程
在后端,我们需要处理分页请求,生成对应的SQL Server分页查询语句,并返回结果。这里假设使用Java的Servlet或Spring MVC来处理请求。 1. SQL Server分页语句: SQL Server提供了多种方式实现分页,比如`ROW_NUMBER...
在SQL Server中,由于不支持MySQL中的`LIMIT`关键字,我们通常使用其他方法来实现分页查询。SQL Server 2008引入了`TOP`和`ROW_NUMBER()`等关键字,使得分页查询成为可能。以下是对这些方法的详细解释: 1. **TOP...
通过研究这个项目,开发者可以学习到SSH框架的整合、Spring的bean管理和事务处理、Hibernate的数据库操作,以及SQLServer的分页查询技巧。同时,对于提高Web应用的用户体验,理解分页原理和实现方式也是必不可少的。
以下是几种常用的SQL Server分页技术: 1. **TOP 和 NOT IN** 分页: 这种方法通过`TOP`关键字选取指定数量的记录,然后使用`NOT IN`子句排除已选取的记录。例如,查询第二页的记录,可以先选取前`@RecordStart`个...
SQL server2008中通用分页存储过程,表名,每页长度,页码都是动态赋值。
在SQL Server中,面对千万级别的大数据量,进行有效的分页查询是数据库性能优化的重要环节。存储过程在这种场景下显得尤为重要,因为它们可以提高查询效率,减少网络传输,并且便于管理和重用代码。本文将深入探讨...
然而,在较旧的SQL Server版本中,可能需要更复杂的查询结构,如在给定的代码示例中所示,使用了动态SQL和变量来构建分页查询。 具体而言,`usp_PagingLarge`存储过程通过以下步骤实现分页: 1. **解析输入参数**...