分页存储过程

来源:互联网 发布:软件项目质量计划书 编辑:程序博客网 时间:2024/05/01 05:29

/******************************************************************
            == 分页存储过程SQL版 ==
  --------------------------------------------------------------
   -使用说明:
   1、数据库必须建立以ID命名的字段作为主键
   2、一般不用设置@SortKey参数,使用默认值ID
   3、@Orders 参数需要输入 Order By
   4、@Wheres 参数不要输入 Where
   5、设置@doCount=0进行分页
   6、多表联查需要如下方式:
      set @TblName='(select a.id,a.name,b.typename as uTypeName from Table1 as a join Table2 as b on a.typeid=b.id)as Tbl'
      //注意,多表联查,不用设置@Fields参数,应为字段已经包含再内
******************************************************************/

ALTER PROCEDURE SP_Page_Exec
(
 @TblName varchar(255),            -- 表名及表集合
 @Fields varchar(1000) ,           -- 列名及字段集合
 @SortKey varchar(255) ,           -- 排序的字段名
 @OrderType varchar(50)  = 'ASC',  -- 排序类型
 @Orders varchar(2000)   = '',     -- 排序条件
 @Wheres varchar(2000)   = '',     -- 查询条件 (不要加 where)
 @PageSize int           = 10,     -- 页长
 @PageIndex int          = 1,    -- 当前页
 @doCount bit            = 0     -- 返回记录总数, 0分页,1返回总记录数
)
AS

declare @strSQL varchar(5000)  -- 主语句
declare @strTmp varchar(200)   -- 临时变量
declare @strOrder varchar(400)   -- 排序类型

-------------------------------如果 @doCount!=0,就执行总数统计,Total为统计值----------------
IF @doCount != 0
begin
  if @Wheres !=''
    set @strSQL = 'select count(*) as Total from ' + @TblName + ' where '+@Wheres
  else
    set @strSQL = 'select count(*) as Total from ' + @TblName + ''
end

------------------------------ 以下的所有代码都是@doCount=0的情况 ---------------------------
ELSE
Begin

  ---- 如果 @OrderType!=Asc,就执行降序 DESC ! ----
  If @OrderType != 'ASC'
  Begin
    Set @strTmp = '<(select min'
    Set @strOrder = ' order by ' + @SortKey +' desc'
  End
  Else
  Begin
   Set @strTmp = '>(select max'
   Set @strOrder = ' order by ' + @SortKey +' asc'
  End
 
  If @Orders = '' 
  Set @Orders=@strOrder
 
  ----- 如果是第一页 -----
  If @PageIndex = 1
  Begin
   if @Wheres != ''
     set @strSQL = 'select top ' + str(@PageSize) +' '+ @Fields + ' from ' + @TblName + ' where ' + @Wheres + ' ' + @strOrder
   else
     set @strSQL = 'select top ' + str(@PageSize) +' '+ @Fields + ' from '+ @TblName + ' '+ @strOrder
  
  End
 
  ---- 以下为真正分页代码 ----
  Else
  Begin
    If @Wheres != ''
 Begin
   Set @strSQL = 'select top ' + str(@PageSize) +' '+@Fields+ ' from ' + @TblName
   + ' where ' + @SortKey + '' + @strTmp + '(' + @SortKey
   + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '+ @SortKey + ' from ' + @TblName + ' where ' + @Wheres + ' ' + @strOrder + ') as TbTb) and  ' + @Wheres + ' '
   +@Orders  -- + @strOrder
 End
 Else
 Begin
   Set @strSQL = 'select top ' + str(@PageSize) +' '+ @Fields + ' from '+ @TblName
   + ' where ' + @SortKey + @strTmp + '('+ @SortKey
   + ') from (select Top ' + str((@PageIndex-1)*@PageSize) + ' '+ @SortKey + ' from ' + @TblName + ' ' + @strOrder + ') as TbTb)'
   +@Orders  -- + @strOrder
 End
  End

END

exec(@strSQL) 

 

ALTER Procedure SP_ExecSql
(
   @sql nvarchar(4000)
)
AS

exec sp_executesql @sql

原创粉丝点击