我的分页存储过程

CREATE  PROCEDURE [dbo].[proc_DataPageList2000]( 

 @tableName   varchar(255),        

 @getFields varchar(1000) = '*',   

 @keyId varchar(50)='Id',  

 @strOrder varchar(255)='', 

 @strWhere  varchar(1500) ='',   

 @pageIndex INT,    

 @pageSize INT,     

 @isCount INT = 0   

) AS

SET NOCOUNT ON

DECLARE @strSql varchar(8000)    

DECLARE @tempRowCount INT 

DECLARE @totalPages INT

DECLARE @currentPageSize INT 

DECLARE @strOrder2 varchar(200)  

DECLARE @rowCount int 

  

  

IF @pageIndex < 1 

    BEGIN

        RAISERROR ('传入的页码或每页记录数大小参数错误!', 16, 1) 

        RETURN

    END

IF NOT (@strWhere is null or RTRIM(@strWhere)='')  

    SET @strWhere = ' WHERE '+@strWhere 

IF NOT (@strOrder is null or RTRIM(@strOrder)='')  

    SET @strOrder = ' ORDER BY '+@strOrder 

Else

    SET @strOrder = ' ORDER BY '+@keyId+' DESC'

  

  

declare @isgroupby int

if charindex('group by', lower(@strWhere))>0 begin

    set @isgroupby=1 

end else begin

    set @isgroupby=0 

end

  

  

IF(@isCount=1) 

    BEGIN

        set @strSql='select count(*) as TotalCount from '+@tableName+@strWhere 

          

        if @isgroupby=1 begin

            set @strSql='select count(*) as TotalCount from (select count(1) as a from '+@tableName+@strWhere + ') as tt1'

        end

          

          

        EXEC(@strSql) 

    END

Else

    BEGIN

    IF(@pageIndex=1) 

        IF @pageSize=-1 BEGIN

            SET @strSql = 'SELECT '+@getFields 

            SET @strSql = @strSql +' FROM ['+@tableName+'] WITH(NOLOCK) '+@strWhere+@strOrder        

            End

        ELse 

            Begin

            SET @strSql = 'SELECT TOP '+CONVERT(VARCHAR(10),@pageSize)+' '+@getFields 

            SET @strSql = @strSql +' FROM ['+@tableName+'] WITH(NOLOCK) '+@strWhere+@strOrder 

        END

    ELSE

        BEGIN

          

        set @strOrder = UPPER(@strOrder)  

        set @strOrder2 =  replace(@strOrder,'DESC','DESC1') 

        set @strOrder2 =  replace(@strOrder2,'ASC','DESC') 

        set @strOrder2 =  replace(@strOrder2,'DESC1','ASC') 

          

        declare @sql nvarchar(500) 

        set @sql ='select @maxCount = count(*) from [' + @tableName + ']' + @strWhere 

          

        if @isgroupby=1 begin

            set @sql='select @maxCount = count(*) from (select count(1) as a from '+@tableName+@strWhere + ') as tt2'

        end

          

        exec sp_executesql @sql,N'@maxCount int output',@rowCount output

          

        SET @totalPages = CASE WHEN @rowCount%@pageSize =0 THEN @rowCount / @pageSize ELSE @rowCount/@pageSize + 1 END 

          

        IF(@pageIndex >= @totalPages) 

            BEGIN

              

            SET @currentPageSize = @rowCount - (@pageIndex -1) * @pageSize 

            WHILE(@currentPageSize < 0) 

            BEGIN

                SET @currentPageSize = @pageSize + @currentPageSize  

            END

            SET @strSql = 'SELECT * from ('+char(13)  

            SET @strSql = @strSql+'SELECT TOP '+ CONVERT(VARCHAR(10),@currentPageSize)+' '+ @getFields +' FROM

['+@tableName+'] WITH(NOLOCK)  '+@strWhere+@strOrder2+char(13

            SET @strSql = @strSql+') as a '+@strOrder 

            END

        ELSE

            BEGIN

                  

                IF(@pageIndex <= @totalPages/2) 

                    BEGIN

                        SET @tempRowCount=@pageIndex*@pageSize 

                        SET @strSql = 'SELECT * from ('+char(13)  

                        SET @strSql = @strSql+'SELECT TOP '+CONVERT(VARCHAR(10),@pageSize)+' * FROM ('+char(13) 

                        SET @strSql = @strSql+' SELECT TOP '+CONVERT(VARCHAR(10),@tempRowCount)+' '+ @getFields +' FROM

['+@tableName+'] WITH(NOLOCK) '+@strWhere+@strOrder 

                        SET @strSql = @strSql+') as a1 '+@strOrder2+char(13)  

                        SET @strSql = @strSql+') as a '+@strOrder 

                    END

                ELSE

                    BEGIN

                          

                        SET @tempRowCount=@rowCount - (@pageIndex -1)*@pageSize 

                        SET @strSql = 'SELECT * from ('+char(13)  

                        SET @strSql = @strSql+'SELECT TOP '+CONVERT(VARCHAR(10),@pageSize)+' * FROM ('+char(13) 

                        SET @strSql = @strSql+' SELECT TOP '+CONVERT(VARCHAR(10),@tempRowCount)+' '+ @getFields +' FROM

['+@tableName+'] WITH(NOLOCK) '+@strWhere+@strOrder2 

                        SET @strSql = @strSql+') as a1 '+@strOrder+char(13)  

                        SET @strSql = @strSql+') as a '

                    END

                END

            END

      

    EXEC(@strSql) 

END

posted @ 2011-11-29 09:32  星月磊子  阅读(172)  评论(0编辑  收藏  举报