查询分页的存储过程

cjpvvv (苹果虫子) 的
 
代码
if  ( object_id (N ' syspr_TablePaginationSearch ' ,N ' P ' is   not   null )
drop   procedure  dbo.syspr_TablePaginationSearch
go
create   procedure  syspr_TablePaginationSearch
(
@SelectField   nvarchar ( 512 ) = ' * '       --  Select语句字段,调用的时候不要输入"select" 
, @FormTables   nvarchar ( 512 )       --  Form子句,表名,包括架构名,调用的时候不要输入"from" 
, @WhereField   nvarchar ( 512 ) = null       --  Where语句、判断字段,调用的时候不要输入"where" 
--
---------------------------------------------------
, @OverPartitionField   nvarchar ( 512 ) = null     --  分区字段,
, @OverOrderField   nvarchar ( 512 )      --  分页字段,主要排序字段,必须
, @GroupField   nvarchar ( 512 ) = null       --  分组字段
, @HavingField   nvarchar ( 512 ) = null      --  分组判断条件
, @OrderField   nvarchar ( 512 ) = null       --  排序字段 
--
---------------------------------------------------
, @PageSize   int = 10          --  页长
, @Page   int = 1           --  页
--
---------------------------------------------------
, @ErrorProcedure   nvarchar ( 128 ) = null  output  --  错误存储过程名
, @ErrorNumber   int = 0  output       --  错误编号
, @ErrorMessage   nvarchar ( 512 ) = null  output  --  错误信息
)
as
begin
-- 定义第一行记录
declare   @firstRow   int ;
-- 定义最后一条记录
declare   @lastRow   int ; -- 设置第一条记录
set   @firstRow = (( @Page - 1 ) * @PageSize ) + 1 ;
-- 设置最后一条记录
set   @lastRow = @firstRow + @PageSize ; -- 定义查询SQL字段
declare   @sqlString   nvarchar ( 512 );
-- 定义Select语句,内查询使用
declare   @selectString   nvarchar ( 512 );
-- 定义Where字段,内查询使用
declare   @whereString   nvarchar ( 512 );
-- 定义Form子句,内查询使用
declare   @formString   nvarchar ( 512 );
-- 定义分组字段,内查询使用
declare   @groupString   nvarchar ( 512 );
-- 定义Having子句,内查询使用
declare   @havingString   nvarchar ( 512 );
-- 定义排序字段,外查询使用
declare   @OrderString   nvarchar ( 512 ); -- 组装Select子句-----------------------------------
set   @SelectField = isnull ( @SelectField ,N '  *  ' );
if ( @SelectField = '' )
   
set   @SelectField = N '  * '  ;
-- 组装select子句到row_number()
set   @selectString = N '  select  ' +   @SelectField +   ' , Row_Number() over(  ' ;
-- 组装到分区partition by 表达式
set   @OverPartitionField = isnull ( @OverPartitionField ,N '' );
if  ( @OverPartitionField <> '' )
   
set   @selectString =   @selectString +   '  partition by  ' +   @OverPartitionField ;
-- 组装到排序分页order by 表达式
set   @OverOrderField = isnull ( @OverOrderField ,N '' );
if  ( @OverOrderField <> '' )
   
set   @selectString =   @selectString +   '  order by  ' +   @OverOrderField +  N ' ) as RowNumber  ' ;
-- over---------------------------------------------
--
组装Form子句------------------------------------
set   @formString =  N '  from  ' +   @FormTables ;
-- 组装Where判断子句------------------------------
set   @WhereField = isnull ( @WhereField ,N '' );
if ( @WhereField <> '' )
   
set   @whereString = N '  where  ' +   @WhereField ;
else
   
set   @whereString = N '' ;
-- where判断子句组装完毕-------------------------
--
组装group by分组子句--------------------------
set   @GroupField = isnull ( @GroupField ,N '' );
if  ( @GroupField <> '' )
begin
   
set   @groupString =  N '  group by  ' +   @GroupField ;    -- 组装having分组判断条件
    set   @HavingField =   isnull ( @HavingField ,N '' );
   
if  ( @HavingField <>  N '' )
    
set   @havingString =  N '  having  ' +   @HavingField ;
   
else
    
set   @havingString = N '' ;
end
else
begin
   
set   @groupString =  N '' ;
   
set   @havingString = N '' ;
end
-- over-------------------------------------------
--
组装order by外排序子句-----------------------
set   @OrderField = isnull ( @OrderField ,N '' );
if  ( @OrderField <> '' )
   
set   @OrderString =  N '  order by  ' +   @OverOrderField +  N '  ,  ' +   @OrderField ;
else
   
set   @OrderString =  N '' ;
-- 如果@groupString不为空,则外排序不起作用
if  ( @groupString <> N '' )
   
set   @OrderString = N '' ;
-- over-------------------------------------------
--
组装分页查询语句
set   @sqlString =
   N
' select *  ' +
   N
' from  ' +
   N
'  (  ' +
    
@selectString +
    
@formString +
    
@whereString +
    
@groupString +
    
@havingString +
   N
'  ) as TB  ' +
   N
' where  ' +
   N
'  TB.RowNumber>= ' + cast ( @firstRow   as   nvarchar ( 10 )) +
   N
'  and TB.RowNumber< ' + cast ( @lastRow   as   nvarchar ( 10 )) +
   
@orderString
-- over-------------------------------------------
--
执行SQL,返回影响行数;如有异常,则抛出,并赋值输出参数
begin  try
   
exec  ( @sqlString );
   
return   @@rowcount ;
end  try
begin  catch
   
set   @ErrorProcedure = Error_Procedure();
   
set   @ErrorNumber = error_number();
   
set   @ErrorMessage = error_message();
end  catch; end
go -- ---------------------------------------------------------
--
简单的测试,查询AdventureWorks库的Person.Address表。
--
以addressid字段顺序分页、并按PostalCode ,StateProvinceID等字段排序。exec dbo.syspr_TablePaginationSearch 
@SelectField = ' * '
,
@FormTables = ' AdventureWorks.Person.Address '
,
@whereField = ' addressid>100 '
,
@OverOrderField = ' addressid asc '
,
@OrderField = ' PostalCode ,StateProvinceID '
,
@Page = 1
,
@PageSize = 10
go
-- 简单的测试,分组统计addressid字段,并分页显示结果集。exec dbo.syspr_TablePaginationSearch 
@SelectField = ' count(addressid) as addressCount,city '
,
@FormTables = ' AdventureWorks.Person.Address '
,
@OverOrderField = ' count(addressid) desc '
,
@GroupField = ' city '
,
@Page = 1
,
@PageSize = 10
go
-- 连接查询并分页
exec  dbo.syspr_TablePaginationSearch 
@SelectField = N '
   addr.AddressLine1,
   addr.AddressLine2,
   addr.City, 
   sp.Name as ProvinceName,
   addr.PostalCode,
   addr.rowguid,
   addr.ModifiedDate
'
,
@FormTables = N '
   AdventureWorks.Person.Address as addr 
   inner join 
   AdventureWorks.Person.StateProvince as sp 
    on addr.StateProvinceID=sp.StateProvinceID
'
,
@OverOrderField = ' addressid asc '
,
@Page = 1
,
@PageSize = 10
go

 

你可能感兴趣的:(存储过程)