SQL分页查询之我见

最近在研究SQL分页,也在网上查过很多资料,我发现SQL分页查询其实也就2中方式:

1:排序字段唯一(这种方式可以用取最大值或者最小值来做,速度最快)。

2:排序字段不唯一(这种方式,就用很多方面,可以用临时表, Not In,WITH ROWNUMBER OVER 等,这种方式在大数据量的时候就有些满了。

本来想写个通用的存储过程,但是写存储过程,无法传递查询条件参数,因此谢了一个C#版的生成SQL语句的方法。

 

代码
/// <summary>
/// 生成分页查询SQL语句
/// </summary>
/// <param name="strQuery">查询表或视图</param>
/// <param name="pageNumber">页码</param>
/// <param name="pageSize">页大小</param>
/// <param name="strOrder">排序字段</param>
/// <param name="isOnly">排序字段是否唯一</param>
/// <param name="strFields">查询字段</param>
/// <param name="strWhere">条件(不带where)</param>
private static string MakeSql(string strQuery,int pageNumber,int pageSize,string strOrder,bool isOnly,string strFields,string strWhere)
{
string strSQl = "";
string strWhereAndWhere=strWhere==""?"":"where "+strWhere;
string strWhereAndAnd = strWhere == "" ? "" : "and " + strWhere;
string strOrderAndOrder = strOrder == "" ? "" : "order by " + strOrder;
if (pageNumber == 1)//如果是第一页
{
strSQl
= string.Format("Select top {0} {1} from {2} {3} {4}", pageSize, strFields, strQuery, strWhereAndWhere, strOrderAndOrder);
return strSQl;
}
else if (isOnly)//排序字段唯一
{
string strTemp = "";

if (strOrder.ToLower().IndexOf("desc") > 0) //如果有降序
{
strTemp
= "< (select min";
}
else
{
strTemp
= "> (select max";
}
string strOrderNoDesc = strOrder.ToLower().Replace("desc", "").Replace("asc", "");//没有排序标志的字段名
//{0}:页大小
//{1}:查询字段
//{2}:表明或视图
//{3}:排序字段
//{4}:临时字符
//{5}:pageSize*pageCount
//{6}:带where的条件
//{7}:带order by 排序字段
//{8}:带and 的条件
strSQl = string.Format(@"Select top {0} {1} from {2} where {3} {4} ({3}) from (select top {5} {3} from {2} {6} {7} ) as T) {8} {7}"
, pageSize, strFields, strQuery, strOrderNoDesc, strTemp, pageSize
* pageNumber, strWhereAndWhere, strOrderAndOrder, strWhereAndAnd);
}
else //排序字段不唯一的分页:有很多种,个人感觉用WITH ROW比较快一点
{
//{0}:带order by 排序字段
//{1}:查询字段
//{2}:表明
//{3}:带where的条件
//{4}:pageSize*pageNumber+1
//{5}:pageSize*(pageNumber+1)
strSQl = string.Format("WITH OrderedOrders AS(Select ROW_NUMBER() OVER ({0}) as RowNumber,{1} from {2} {3}) Select {1} from OrderedOrders WHERE RowNumber between {4} and {5}"
,strOrderAndOrder,strFields,strQuery,strWhereAndWhere,pageSize
*pageNumber+1,pageSize*(pageNumber+1));
}
return strSQl;
}

这个代码没有考虑组合排序,以后会加上。

第一次发博文,请大家多多指点。

posted on 2010-09-05 20:18  水影倒影  阅读(374)  评论(2编辑  收藏  举报

导航