ms sql 2005 2008 通用表分页存储过程

USE [LevcnBase]
GO
/****** Object:  StoredProcedure [dbo].[Paging]    Script Date: 11/09/2011 18:10:11 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[Paging] 
 @TableName varchar(500),				--表名
 @OutTableName varchar(500) = 'List',	--输出的表名
 @Fields varchar(5000) = '*',			--字段名(全部字段为*)
 @OrderField varchar(5000),				--排序字段(必须!支持多字段)
 @sqlWhere varchar(5000) = '',			--条件语句(不用加where)
 @pageSize int,							--每页多少条记录
 @pageIndex int = 1						--指定当前为第几页
             --返回总页数 
             
             
             /*
--多表联合
exec [Paging]
@tableName = ' T_User as u left join T_Group as g on u.GID = G.GID'
,@OrderField = 'age'
,@Fields = 'name,age'
,@OutTableName = 'DataList' --可选 (输出的表名)
,@pageSize = 5
,@sqlWhere = ' age>4 '
,@PageIndex = 4

--单表
exec [Paging]
@tableName = ' T_User'
,@OrderField = 'age'
,@Fields = 'name,age'
,@OutTableName = 'DataList' --可选 (输出的表名)
,@pageSize = 5
,@sqlWhere = ' age>4 '
,@PageIndex = 1
             
             */
as
begin

    Begin Tran --开始事务

    Declare @sql nvarchar(4000);
    Declare @totalRecord int;    
	Declare @TotalPage int;

    --计算总记录数

    if (@SqlWhere='' or @sqlWhere = NULL)
        set @sql = 'select @totalRecord = count(*) from ' + @TableName
    else
        set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere
--select @sql

    EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数        
    
    --计算总页数
    select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)

    if (@SqlWhere='' or @sqlWhere=NULL)
        set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName 
    else
        set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere    
        
    
    --处理页数超出范围情况
    if @PageIndex<=0 
        Set @pageIndex = 1
    
    --if @pageIndex>@TotalPage
        --Set @pageIndex = @TotalPage

     --处理开始点和结束点
    Declare @StartRecord int
    Declare @EndRecord int
    
    set @StartRecord = (@pageIndex-1)*@PageSize + 1
    set @EndRecord = @StartRecord + @pageSize - 1

    --继续合成sql语句
    --set @Sql = @Sql + ') as ' + @TableName + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)
    set @Sql = @Sql + ') as ' + @OutTableName + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)
    
    --select @sql
    Exec(@Sql)
    select  @totalRecord as TotalRecord, 
			@TotalPage as TotalPage,
			@PageIndex as PageIndex,
			@StartRecord as StartRecord,
			@EndRecord as EndRecord
    ---------------------------------------------------
    If @@Error <> 0
      Begin
        RollBack Tran
        Return -1
      End
     Else
      Begin
        Commit Tran
        Return @totalRecord ---返回记录总数
      End    
end

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值