SQL分页存储过程

SQL中的分页存储过程,你懂的...

/******************************************************************************

**  功能:SQL 分页查询

**  作者:Danny,Li ([email protected])

**  日期:2011-11-09

*******************************************************************************

**  返回值列表

****************************

**  返回值        涵义

**  -------        -----------------------------------------------------------

**

*******************************************************************************

**  修订日志

****************************

**  日期        作者        修订备注

**  ----------    --------    -----------------------------------------------

**    

*******************************************************************************/

CREATE PROCEDURE [dbo].[CSP_GetRecordsByPage]

    @tblName varchar(2000),            --表名

    @strGetFields varchar(2000)='*',    --需要返回的列

    @fldName varchar(255)='',            --排序的字段名

    @PageSize int =10,                --页尺寸

    @PageIndex int =1,                -- 页码

    @doCount bit =0,                    --返回记录总数,非0值则返回

    @OrderType bit =0,                --设置排序类型,非0值则降序

    @strWhere nvarchar(1500)=''        --查询条件(注意:不要加where)

AS

BEGIN

    

    DECLARE @strSQL nvarchar(4000)        --主语句

    DECLARE @strTmp varchar(110)            --临时变量

    DECLARE @strOrder varchar(400)        --排序类型

    DECLARE @noDotFldName varchar(255)    --如果是多表联合查询则去掉点前面的字符



    SET @noDotFldName = SUBSTRING(@fldName,CHARINDEX('.',@fldName)+1,len(@fldName))



    --以下代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况

    IF @doCount != 0

    BEGIN

        IF @strWhere !=''

            SET @strSQL = 'SELECT COUNT(*) AS TOTAL FROM ' + @tblName + ' WHERE ' + @strWhere

        ELSE

            SET @strSQL = 'SELECT COUNT(*) AS TOTAL FROM ' + @tblName

    END

    ELSE

    BEGIN

        --如果@OrderType不是0,就执行降序

        IF @OrderType != 0 

        BEGIN

            SET @strTmp = '<(SELECT MIN'

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

        END

        ELSE

        BEGIN

            SET @strTmp = '>(SELECT   MAX'

            SET @strOrder = ' ORDER BY ' + @fldName + ' ASC'

        END



        --如果是第一页就执行以下代码,这样会加快执行速度

        IF @PageIndex = 1

        BEGIN

            IF @strWhere != ''

                SET @strSQL = 'SELECT TOP ' + STR(@PageSize) +' ' + @strGetFields + ' FROM ' + @tblName + ' WHERE ' + @strWhere

            ELSE

                SET @strSQL = 'SELECT TOP ' + STR(@PageSize) +' ' + @strGetFields + ' FROM '+ @tblName

        END   

        ELSE   

        BEGIN   

            --以下代码赋予了@strSQL以真正执行的SQL代码   

            SET @strSQL = 'SELECT TOP ' + STR(@PageSize) + ' ' + @strGetFields + ' FROM ' + @tblName 

                + ' WHERE ' + @fldName + ' ' + @strTmp + '(' + @noDotFldName + ') FROM (SELECT TOP ' 

                + STR((@PageIndex-1)*@PageSize) + ' ' + @fldName + ' FROM ' + @tblName 

                + ' ' + @strOrder + ') AS tblTmp)'

            

            IF @strWhere != ''   

                SET @strSQL = 'SELECT TOP ' + STR(@PageSize) + ' ' + @strGetFields+ ' FROM ' + @tblName 

                    + ' WHERE ' + @fldName + ' ' + @strTmp + '(' + @noDotFldName   

                    + ') FROM (SELECT TOP ' + STR((@PageIndex-1)*@PageSize) + ' ' + @fldName 

                    + ' FROM ' + @tblName + ' WHERE ' + @strWhere + ' ' + @strOrder 

                    + ') AS TBLTMP) AND ' + @strWhere

        END

            

        IF @strOrder IS NOT NULL AND @strOrder!='' 

            SET @strSQL = @strSQL+' '+@strOrder

    

    END 

    

    PRINT @strSQL

    

    EXEC(@strSQL)

    

END

 

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