热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> 数据库>>正文内容

推荐一个SQL分页函数

发布时间:2009年06月11日点击数: 未知

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

CREATE PROCEDURE [dbo].[sp_GetPager]  
    @TableName varchar(50),            --表名
    @Fields varchar(5000) = '*',    --字段名(全部字段为*)
    @OrderField varchar(5000),      --排序字段(必须!支持多字段)
    @OrderType bit = 0,                -- 设置排序类型, 非 0 值则降序
    @sqlWhere varchar(5000) = Null,    --条件语句(不用加where)
    @PageIndex int = 1 ,            --指定当前为第几页
    @PageSize int = 10,             --每页多少条记录
    @TotalRecord int output,
    @TotalPage int output           --返回总页数
AS
BEGIN
    
     Begin Tran --开始事务

    Declare @sql nvarchar(4000);  

    if @TotalRecord<=0 begin
        --计算总记录数
              
        if (@SqlWhere='' or @sqlWhere=NULL)
            set @sql = 'select @TotalRecord = count(*) from ' + @TableName
        else
            set @sql = 'select @TotalRecord = count(*) from ' + @TableName + ' with(nolock) where ' + @sqlWhere

        EXEC sp_executesql @sql,N'@TotalRecord int OUTPUT',@TotalRecord OUTPUT--计算总记录数        
    end

    --计算总页数
    select @TotalPage=CEILING((@TotalRecord+0.0)/@PageSize)

    if (@SqlWhere='' or @sqlWhere=NULL)
        if @OrderType != 0
            set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ' DESC) as RowID,' + @Fields + ' from ' + @TableName  
        else
            set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ' ASC) as RowID,' + @Fields + ' from ' + @TableName  
    else
        if @OrderType != 0
            set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ' DESC) as RowID,' + @Fields + ' from ' + @TableName + ' with(nolock) where ' + @SqlWhere    
        else
            set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ' ASC) as RowID,' + @Fields + ' from ' + @TableName + ' with(nolock) 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 t where RowID between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)
     print @sql    
    Exec(@Sql)
    ---------------------------------------------------
    If @@Error <> 0
      Begin
        RollBack Tran
        Return -1
      End
     Else
      Begin
        Commit Tran
        Return @TotalRecord ---返回记录总数
      End    
END

本站热点业务

更多模板/案例展示

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作