SQL分页查询 ROW_NUMBER高效率分页(仅支持MSSQL2005及以上)

Joe  于  2017-03-08 19:10:35  发布至  编程相关  累计    次阅读

/// <summary>
/// 获取分页SQL语句,默认row_number为关健字,所有表不允许使用该字段名
/// </summary>
/// <param name="_recordCount">记录总数</param>
/// <param name="_pageSize">每页记录数</param>
/// <param name="_pageIndex">当前页数</param>
/// <param name="_safeSql">SQL查询语句</param>
/// <param name="_orderField">排序字段,多个则用“,”隔开</param>
/// <returns>分页SQL语句</returns>
public static string CreatePagingSql(int _recordCount, int _pageSize, int _pageIndex, string _safeSql, string _orderField)
{
    //计算总页数
    _pageSize = _pageSize == 0 ? _recordCount : _pageSize;
    int pageCount = (_recordCount + _pageSize - 1) / _pageSize;
    //检查当前页数
    if (_pageIndex < 1)
    {
        _pageIndex = 1;
    }
    else if (_pageIndex > pageCount)
    {
        _pageIndex = pageCount;
    }
    //拼接SQL字符串,加上ROW_NUMBER函数进行分页
    StringBuilder newSafeSql = new StringBuilder();
    newSafeSql.AppendFormat("SELECT ROW_NUMBER() OVER(ORDER BY {0}) as row_number,", _orderField);
    newSafeSql.Append(_safeSql.Substring(_safeSql.ToUpper().IndexOf("SELECT") + 6));
    //拼接成最终的SQL语句
    StringBuilder sbSql = new StringBuilder();
    sbSql.Append("SELECT * FROM (");
    sbSql.Append(newSafeSql.ToString());
    sbSql.Append(") AS T");
    sbSql.AppendFormat(" WHERE row_number between {0} and {1}", ((_pageIndex - 1) * _pageSize) + 1, _pageIndex * _pageSize);
    return sbSql.ToString();
}
/// <summary>
/// 获取记录总数SQL语句
/// </summary>
/// <param name="_safeSql">SQL查询语句</param>
/// <returns>记录总数SQL语句</returns>
public static string CreateCountingSql(string _safeSql)
{
    return string.Format(" SELECT COUNT(1) AS RecordCount FROM ({0}) AS T ", _safeSql);
}


上一篇:JS判断浏览器是否是IE9版本以下下一篇:被玩坏了的web前端:不为人知的前端冷知识集锦(转载)