`

SQL Server分页查询

阅读更多

注: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分页查询概述 分页查询是指从大量数据中按需取出一部分数据的过程,通常用于网页展示或大型数据报表中,以提高加载速度和减少服务器负担。在SQL Server中,实现分页查询有多种方法,包括使用`ROW_...

    sqlserver分页查询语句

    sqlserver分页查询语句;sqlserver分页查询语句;sqlserver分页查询语句;

    mybatis中进行sqlserver分页

    mybatis中,sqlserver分页

    java 连接sqlserver数据库查询,并分页显示

    String url = "jdbc:sqlserver://localhost:1433;databaseName=myDatabase"; String username = "myUsername"; String password = "myPassword"; try { Class.forName(...

    sql server 分页

    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数据库分页查询

    ### SQL Server 数据库分页查询方法详解 #### 一、背景与问题定义 在实际的数据库操作中,分页查询是非常常见的需求之一。对于大型数据集来说,一次加载所有数据到前端显示是不现实的,这不仅会增加服务器负担,还...

    SQL SERVER 分页查询二分法

    通常多表联查并且数据大时,分页查询时,会出现查询性能问题,查分页后面的数据,时间越久。但我们可以通过判断查询数据的总数据来进行相应的查询方式,从而保证性能。

    java语言的分页查询功能(mysql和sql server)

    本教程将详细讲解如何在Java中实现不分框架的分页查询,同时涵盖对MySQL和SQL Server数据库的支持。 一、基础知识 1. 分页概念:分页是将大量数据按一定数量分成若干部分,每次只加载一部分到内存中显示,用户可以...

    ASP.NET基于SQLServer的分页

    3. **SQL Server分页查询** - `TOP`子句:在SQL Server中,可以使用`TOP`子句配合`ORDER BY`来实现分页。例如,获取第一页的数据,可以写成`SELECT TOP pageSize * FROM table ORDER BY sortField DESC`。 - `...

    mysql,oracle,sqlserver分页

    ### 数据库分页技术详解:MySQL、Oracle与SQL Server #### Oracle 分页 ...例如,在Oracle中利用`ROWNUM`进行简单快速的分页处理,在SQL Server中则可以利用窗口函数实现更为灵活高效的分页查询。

    SqlServer数据库中的分页语句

    首先,我们要明白SQL Server分页查询的基本思想:一次查询只返回所需页面的数据,而不是一次性获取所有数据,这样可以减少网络传输量,减轻服务器压力,并提升查询速度。在SQL Server中,通常使用`TOP`关键字结合子...

    sql Server 通用分页存储过程

    sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程

    sqlserver 实现分页的前台代码 以及后台的sqlserver语句

    在后端,我们需要处理分页请求,生成对应的SQL Server分页查询语句,并返回结果。这里假设使用Java的Servlet或Spring MVC来处理请求。 1. SQL Server分页语句: SQL Server提供了多种方式实现分页,比如`ROW_NUMBER...

    sqlserver分页查询处理方法小结

    在SQL Server中,由于不支持MySQL中的`LIMIT`关键字,我们通常使用其他方法来实现分页查询。SQL Server 2008引入了`TOP`和`ROW_NUMBER()`等关键字,使得分页查询成为可能。以下是对这些方法的详细解释: 1. **TOP...

    SSH框架+SQLServer实现分页的小项目

    通过研究这个项目,开发者可以学习到SSH框架的整合、Spring的bean管理和事务处理、Hibernate的数据库操作,以及SQLServer的分页查询技巧。同时,对于提高Web应用的用户体验,理解分页原理和实现方式也是必不可少的。

    sql server 2008通用分页

    SQL server2008中通用分页存储过程,表名,每页长度,页码都是动态赋值。

    sql server分页技术(SQL Server 与Access数据库相关分页技术)

    以下是几种常用的SQL Server分页技术: 1. **TOP 和 NOT IN** 分页: 这种方法通过`TOP`关键字选取指定数量的记录,然后使用`NOT IN`子句排除已选取的记录。例如,查询第二页的记录,可以先选取前`@RecordStart`个...

    千万级数据分页查询存储过程SQLServer

    在SQL Server中,面对千万级别的大数据量,进行有效的分页查询是数据库性能优化的重要环节。存储过程在这种场景下显得尤为重要,因为它们可以提高查询效率,减少网络传输,并且便于管理和重用代码。本文将深入探讨...

    sqlserver+group by分组查询分页存储过程

    然而,在较旧的SQL Server版本中,可能需要更复杂的查询结构,如在给定的代码示例中所示,使用了动态SQL和变量来构建分页查询。 具体而言,`usp_PagingLarge`存储过程通过以下步骤实现分页: 1. **解析输入参数**...

Global site tag (gtag.js) - Google Analytics