|
sql server分页使用存储过程要更高效些 下面这个存储过程是从SQL区找到的 ----------------------------------------------------------------------------------------------------------------------------------- CREATE Proc p_show @QueryStr varchar(8000), --表名、视图名、查询语句 @PageSize int=10, --每页的大小(行数) @PageCurrent int=1, --要显示的页 @FdShow varchar (8000)='''''''', --要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段 @FdOrder nvarchar (3000)='''''''' --排序字段列表 as declare @FdName nvarchar(550) --表中的主键或表、临时表中的标识列名 ,@Id1 varchar(80),@Id2 varchar(80) --开始和结束的记录号 ,@Obj_ID int --对象ID --表中有复合主键的处理 declare @strfd nvarchar(4000) --复合主键列表 ,@strjoin varchar(8000) --连接字段 ,@strwhere nvarchar(4000) --查询条件 select @Obj_ID=object_id(@QueryStr) ,@FdShow=case isnull(@FdShow,'''''''') when '''''''' then '''' *'''' else '''' ''''+@FdShow end ,@FdOrder=case isnull(@FdOrder,'''''''') when '''''''' then '''''''' else '''' order by ''''+@FdOrder end ,@QueryStr=case when @Obj_ID is not null then '''' ''''+@QueryStr else '''' (''''+@QueryStr+'''') a'''' end
--如果显示第一页,可以直接用top来完成 if @PageCurrent=1 begin select @Id1=cast(@PageSize as varchar(50)) exec(''''select top ''''+@Id1+@FdShow+'''' from ''''+@QueryStr+@FdOrder) return end --如果是表,则检查表中是否有标识更或主键 if @Obj_ID is not null and objectproperty(@Obj_ID,''''IsTable'''')=1 begin select @Id1=cast(@PageSize as varchar(50)) ,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(50)) select @FdName=name from syscolumns where id=@Obj_ID and status=0x80 if @@rowcount=0 --如果表中无标识列,则检查表中是否有主键 begin if not exists(select 1 from sysobjects where parent_obj=@Obj_ID and xtype=''''PK'''') goto lbusetemp --如果表中无主键,则用临时表处理 select @FdName=name from syscolumns where id=@Obj_ID and colid in( select colid from sysindexkeys where @Obj_ID=id and indid in( select indid from sysindexes where @Obj_ID=id and name in( select name from sysobjects where xtype=''''PK'''' and parent_obj=@Obj_ID ))) if @@rowcount>1 --检查表中的主键是否为复合主键 begin select @strfd='''''''',@strjoin='''''''',@strwhere='''''''' select @strfd=@strfd+'''',[''''+name+'''']'''' ,@strjoin=@strjoin+'''' and a.[''''+name+'''']=b.[''''+name+'''']'''' ,@strwhere=@strwhere+'''' and b.[''''+name+''''] is null'''' from syscolumns where id=@Obj_ID and colid in( select colid from sysindexkeys where @Obj_ID=id and indid in( select indid from sysindexes where @Obj_ID=id and name in( select name from sysobjects where xtype=''''PK'''' and parent_obj=@Obj_ID ))) select @strfd=substring(@strfd,2,2000) ,@strjoin=substring(@strjoin,5,4000) ,@strwhere=substring(@strwhere,5,4000) goto lbusepk end end end else goto lbusetemp /*--使用标识列或主键为单一字段的处理方法--*/ lbuseidentity: exec(''''select top ''''+@Id1+@FdShow+'''' from ''''+@QueryStr +'''' where ''''+@FdName+'''' not in(select top '''' +@Id2+'''' ''''+@FdName+'''' from ''''+@QueryStr+@FdOrder +'''')''''+@FdOrder ) return /*--表中有复合主键的处理方法--*/ lbusepk: exec(''''select ''''+@FdShow+'''' from(select top ''''+@Id1+'''' a.* from (select top 100 percent * from ''''+@QueryStr+@FdOrder+'''') a left join (select top ''''+@Id2+'''' ''''+@strfd+'''' from ''''+@QueryStr+@FdOrder+'''') b on ''''+@strjoin+'''' where ''''+@strwhere+'''') a'''' ) return /*--用临时表处理的方法--*/ lbusetemp: select @FdName=''''[ID_''''+cast(newid() as varchar(80))+'''']'''' ,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(50)) ,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(50)) exec(''''select ''''+@FdName+''''=identity(int,0,1),''''+@FdShow+'''' into #tb from''''+@QueryStr+@FdOrder+'''' select ''''+@FdShow+'''' from #tb where ''''+@FdName+'''' between '''' +@Id1+'''' and ''''+@Id2 ) GO -------------------------------------------------------------------------------------------------------------------------------- 这里需要建立一个分页类ResultGatherPro.java -------------------------------------------------------------------------------------------------------------------------------- package com; import conn.DBConnManager;//这个是数据库连接池,可以替换成自己的 import java.sql.*; import java.util.Enumeration; import java.util.List; import java.util.Map; import java.util.ArrayList; import java.util.HashMap; import javax.servlet.http.HttpServletRequest; import com.util.myRedirect; public class ResultGatherPro { private String sql; private int intPageSize; //每页行数 private int intRowCount; private int intPageCount; private int intPage; //页号 private String Counter; public ResultGatherPro() { } public ResultGatherPro(String sqlcom,int rownum,int pagenum,String counter) { sql=sqlcom; intPageSize = rownum; intPage = pagenum; Counter = counter; } public List selectRS(String sqlcom,int rownum,int pagenum,String counter) { this.sql = sqlcom; this.intPageSize = rownum; this.intPage = pagenum; this.Counter = counter; return selectRS(); } public List selectRS() { List rsall = new ArrayList(); Map rsTree; DBConnManager conn = null; Connection con = null; CallableStatement stmt = null; ResultSet rs = null; Statement st = null; ResultSet rsc = null; try{ conn = DBConnManager.getInstance(); con = conn.getConnection("mssql"); st = con.createStatement(); rsc=st.executeQuery(Counter); while(rsc.next()) { intRowCount=rsc.getInt("allrow"); } stmt = con.prepareCall("{call p_show(''''"+sql+"'''',"+intPageSize+","+intPage+")}"); rs = stmt.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount(); Object[] aa = new Object[numberOfColumns-1]; intPageCount = (intRowCount+intPageSize-1)/intPageSize; while(rs.next()) { rsTree = new HashMap(numberOfColumns); for(int r=1;r<numberOfColumns+1;r++) { rsTree.put(rsmd.getColumnName(r),rs.getObject(r)); } rsall.add(rsTree); } }catch(java.lang.Exception ex){ ex.printStackTrace(); }finally{ try{
[1] [2] 下一页 [Access]sql随机抽取记录 [Access]ASP&SQL让select查询结果随机排序的实现方法 [聊天工具]企业邮件系统的利器----FoxMail Server [系统软件]OPEN SERVER 5.0.5安装EXP300阵列柜 [系统软件]SQL语句性能优化--LECCO SQL Expert [系统软件]关于Windows2000Server的灾难恢复 [常用软件][网络]下载服务革命性风暴Poco Server评测 [C语言系列]动态创建SQL Server数据库、表、存储过程等架构信… [C语言系列]SQL Server到DB2连接服务器的实现 [C语言系列]SQL Server到SYBASE连接服务器的实现
|