数据库分页存储过程,支持多表联合查询
2015-05-21 16:07
736 查看
数据库分页存储过程,支持多表联合查询
CREATE PROCEDURE [dbo].[getInQuiryAllByPage] @tableNames varchar(5000), --表名,可多表,逗号分隔 @tbFields varchar(5000)= '* ',--字段名,如果多表请带前缀 @conditionStr varchar(5000)= ' ', --where子句,可为空,不带where @sortedStr varchar(5000), --排序字段,可多个,要带desc或asc,不带order by,必须,不能为空 --排序字段不能有空值,或者在where中排除空值或者用isnull函数解决 @needCount bit = 1, --是否需要得到纪录总数 @pageIndex int =0, --页索引 @pageSize int=10, --页大小 @recordCount int =0 output, --返回纪录总数 @pageCount int =0 output --返回页总数 AS BEGIN declare @sql nvarchar(4000) --主sql语句 declare @sortStr2 varchar(8000) --order by子句 declare @sortStr3 varchar(8000) --order by子句 declare @sortStr4 varchar(8000) --order by子句 declare @whereStr nvarchar(4000) --条件 declare @sortStr nvarchar(4000) --条件 set @sortStr = LOWER(@sortedStr) set @sortStr2 = REPLACE(@sortStr, 'desc', ' @a@ ') set @sortStr2 = REPLACE(@sortStr2, 'asc', ' @d@ ') set @sortStr2 = REPLACE(@sortStr2, ' @a@ ', ' asc ') set @sortStr2 = REPLACE(@sortStr2, ' @d@ ', ' desc ') -------------------------------------------------------------- set @sortStr4 = @sortStr2 set @sortStr2 = REPLACE(@sortStr2,'a.',' ') set @sortStr2 = REPLACE(@sortStr2,'b.',' ') set @sortStr2 = REPLACE(@sortStr2,'c.',' ') set @sortStr2 = REPLACE(@sortStr2,'e.',' ') set @sortStr2 = REPLACE(@sortStr2,'f.',' ') set @sortStr2 = REPLACE(@sortStr2,'g.',' ') set @sortStr3 = @sortStr set @sortStr3 = REPLACE(@sortStr3,'a.',' ') set @sortStr3 = REPLACE(@sortStr3,'b.',' ') set @sortStr3 = REPLACE(@sortStr3,'c.',' ') set @sortStr3 = REPLACE(@sortStr3,'e.',' ') set @sortStr3 = REPLACE(@sortStr3,'f.',' ') set @sortStr3 = REPLACE(@sortStr3,'g.',' ') -------------------------------------------------------------- set @sortStr = ' order by ' + @sortStr set @sortStr2 = ' order by ' + @sortStr2 set @sortStr3 = ' order by ' + @sortStr3 set @sortStr4 = ' order by ' + @sortStr4 if(@conditionStr is not null and @conditionStr != ' ' ) set @whereStr = ' where ' + @conditionStr else set @whereStr = ' ' --if(@needCound != 0 or @pageIndex = 0 ) --以下获得纪录总数 begin DECLARE @R int SET @sql= 'select @R=count(*) from '+@tableNames + @whereStr EXEC SP_EXECUTESQL @SQL,N'@R int OUTPUT ',@R OUTPUT SET @recordCount = @R set @pageCount = ((@recordCount-1)/@pageSize)+1 end if(@pageIndex <2) --如果是第一页 begin set @pageIndex = 1 set @sql= 'select top '+ str(@pageSize) + ' '+ @tbFields + ' from ' + @tableNames + @whereStr + @sortStr; end else --其它页 begin if( @recordCount>@pageIndex*@pageSize) <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>SET @sql= 'SELECT * FROM ( ' <span style="white-space:pre"> </span>+ 'SELECT TOP ' + STR(@pageSize) + ' * FROM ( ' <span style="white-space:pre"> </span>+ 'select top ' + STR(@pageSize*@pageIndex) + ' '+ @tbFields + ' FROM ' <span style="white-space:pre"> </span>+ @tableNames + @whereStr + @sortStr + ') as a ' <span style="white-space:pre"> </span>+ @sortStr2 + ') as b ' + @sortStr3 else <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>SET @sql= ' select * FROM (' + ' SELECT top '+ STR(@recordCount-@pageSize*(@pageCount-1)) <span style="white-space:pre"> </span>+ ' '+ @tbFields + ' FROM ' <span style="white-space:pre"> </span>+ @tableNames + @whereStr + @sortStr4 + ' ) AS a' + @sortStr3 end print @sql EXEC SP_EXECUTESQL @sql END
相关文章推荐
- SQL分页存储过程(不支持多表联合查询,不支持多字段排序)
- 分页存储过程支持多表联合
- sqlserver关于分页存储过程的优化【让数据库按我们的意思执行查询计划】
- 支持任意字段排序及多表关联查询的存储过程分页
- 多表查询分页存储过程,解决了第二页不显示的问题
- SQL通用存储过程分页,支持多表联合
- 千万数量级分页存储过程2(可支持多表查询,任意排序)
- 两个分页存储过程的效率比较(均为多表查询)
- 高级自定义查询、分页、多表联合存储过程
- 一个查询数据库所有表的存储过程(允许按表名模糊查询一级按显示数量进行分页)
- 数据库操作 sqlserver查询存储过程+分页
- 高级自定义查询、分页、多表联合存储过程(转)
- 关于分页存储过程的优化【让数据库按我们的意思执行查询计划】
- 支持多表分页查询的存储过程
- 分页存储过程,可支持多表查询[转]
- [MSSQL]SQL通用存储过程分页,支持多表联合
- 多表查询分页存储过程,解决了第二页不显示的问题
- 数据库分页存储过程,支持多字段排序
- [MSSQL]SQL通用存储过程分页,支持多表联合
- 分页存储过程,可支持多表查询