SQL分页存储过程

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

/******************************************************************************
**  功能:SQL 分页查询
**  作者:Danny,Li (xing.dong.li@163.com)
**  日期: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
原文地址:https://www.cnblogs.com/dannyli/p/2662839.html