Procedimiento almacenado de paginación de base de datos, que admite consultas conjuntas de varias tablas

Procedimiento almacenado de paginación de base de datos, que admite consultas conjuntas de varias tablas


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

Guess you like

Origin blog.csdn.net/gaoxu529/article/details/45893241