您的位置:首页 > 数据库

数据库分页存储过程,支持多表联合查询

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