分页sql

1.通用的分页sql

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

 

ALTER PROCEDURE [dbo].[PPagedSql]
(
 @TableName VARCHAR(4000),          --表名或视图或关联表
 @ColumnName VARCHAR(4000),   --字段名
 @WhereString VARCHAR(4000),  --条件语句(必须加WHERE)
 @SortString VARCHAR(4000),   --排序字段(必须加ORDER BY)
 @PageSize INT = 10,    --每页多少条记录
 @PageIndex INT = 1,    --指定当前为第几页
 @RowCount INT OUTPUT    --返回总记录数
)
AS
 
BEGIN
 DECLARE @PageCount INT;  
 DECLARE @StartIndex INT;
    DECLARE @EndIndex INT;
    DECLARE @RowCountSql NVARCHAR(4000);
    DECLARE @PagedSql NVARCHAR(4000);

    SET @RowCountSql = N'SELECT @RowCount = COUNT(*) FROM ' + @TableName + ' ' + @WhereString;
 --返回总记录数
    EXEC sp_executesql @RowCountSql,N'@RowCount INT OUT',@RowCount OUTPUT;

 SET @PageCount = CEILING((@RowCount*1.0) / @PageSize)
 IF @PageCount>0 AND @PageCount < @PageIndex
  BEGIN
   SET @PageIndex = @PageCount;
  END
    SET @StartIndex = (@PageIndex-1)*@PageSize + 1;
    SET @EndIndex = @PageIndex*@PageSize;

    SET @PagedSql = N'(SELECT ROW_NUMBER() OVER (' + @SortString + ') AS RowId,' + @ColumnName +' FROM ' + @TableName + ' ' + @WhereString;
    SET @PagedSql = 'SELECT * FROM ' + @PagedSql + ') AS t WHERE RowId BETWEEN ' + LTRIM(STR(@StartIndex)) + ' AND ' + LTRIM(STR(@EndIndex));
    --执行分页数据
 EXEC sp_executesql @PagedSql
END

 

 

1.专用的分页sql

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

 


ALTER PROCEDURE [dbo].[PPagedSceneOrder]
(
 @OrderId VARCHAR(10),
 @AgentId VARCHAR(22),
 @PayType TINYINT,
 @Status TINYINT,
 @TimeType TINYINT,
 @BeginTime DATETIME,
 @EndTime DATETIME,
 @ContactName NVARCHAR(17),
 @Mobile VARCHAR(13),
 @SceneName VARCHAR(62),
 @TicketName VARCHAR(62),
 @PageSize INT=10,
 @PageIndex INT=1,
 @IsRowCount BIT=0,
 @RowCount INT OUTPUT
)
AS
BEGIN
 DECLARE @StartIndex INT;
    DECLARE @EndIndex INT;
 DECLARE @PagedSql NVARCHAR(4000);
 DECLARE @RowCountSql NVARCHAR(4000);
 DECLARE @WhereString NVARCHAR(4000);

 SET @StartIndex = (@PageIndex-1)*@PageSize + 1
    SET @EndIndex = @PageIndex*@PageSize

 SET @PagedSql='SELECT ROW_NUMBER() OVER (ORDER BY OS.OrderId DESC)AS RowId,
 O.OrderId, O.Status,
 OC.ContactName, OC.Mobile,
 OS.TicketNum,OS.PlanGoDate,OS.SalePrice,OS.AgentId,OS.CreateTime,OS.PayType,
 ST.TicketName,
 S.SceneName
 FROM Orders AS O INNER JOIN
 OrderContact AS OC ON O.OrderId = OC.OrderId INNER JOIN
 OrderScene AS OS ON O.OrderId = OS.OrderId INNER JOIN
 SceneTicket AS ST ON OS.TicketId = ST.TicketId INNER JOIN
 Scene AS S ON S.SceneId = ST.SceneId'

 SET @RowCountSql='SELECT @RowCount=COUNT(*) FROM Orders AS O INNER JOIN
 OrderContact AS OC ON O.OrderId = OC.OrderId INNER JOIN
 OrderScene AS OS ON O.OrderId = OS.OrderId INNER JOIN
 SceneTicket AS ST ON OS.TicketId = ST.TicketId INNER JOIN
 Scene AS S ON S.SceneId = ST.SceneId';

 SET @WhereString='WHERE 1=1'; 
 IF @OrderId<>'' AND @OrderId IS NOT NULL
 BEGIN  
  SET @WhereString=@WhereString+' AND (O.OrderId LIKE @OrderId)'
 END 
 IF @AgentId<>'' AND @AgentId IS NOT NULL
 BEGIN
  SET @WhereString=@WhereString+' AND (OS.AgentId LIKE @AgentId)'
 END 
 IF @PayType IS NOT NULL
 BEGIN
  SET @WhereString=@WhereString+' AND (ST.PayType=@PayType)'
 END
 IF @Status IS NOT NULL
 BEGIN
     SET @WhereString=@WhereString+' AND (O.Status=@Status)'
 END
 IF @TimeType=0
  BEGIN
   SET @WhereString=@WhereString+' AND (OS.CreateTime>=@BeginTime AND OS.CreateTime<@EndTime)'
  END
 ELSE IF @TimeType=1
  BEGIN
   SET @WhereString=@WhereString+' AND (OS.PlanGoDate>=@BeginTime AND OS.PlanGoDate<@EndTime)'
  END
 IF @ContactName<>'' AND @ContactName IS NOT NULL
  BEGIN
   SET @WhereString=@WhereString+' AND (OC.ContactName LIKE @ContactName)'
  END
 IF @Mobile<>'' AND @Mobile IS NOT NULL
  BEGIN
   SET @WhereString=@WhereString+' AND (OC.Mobile LIKE @Mobile)'
  END
 IF @SceneName<>'' AND @SceneName IS NOT NULL
  BEGIN
   SET @WhereString=@WhereString+' AND (S.SceneName LIKE @SceneName)'
  END
 IF @TicketName<>'' AND @TicketName IS NOT NULL
  BEGIN
   SET @WhereString=@WhereString+' AND (ST.TicketName LIKE @TicketName)'
  END

 IF (@WhereString<>'' OR @WhereString IS NOT NULL)
        BEGIN           
            SET @PagedSql=@PagedSql+' '+@WhereString;
   SET @RowCountSql=@RowCountSql+' '+@WhereString;
        END

 SET @OrderId=N'%'+@OrderId+N'%';
 SET @AgentId=N'%'+@AgentId+N'%';
 SET @ContactName=N'%'+@ContactName+N'%';
 SET @Mobile=N'%'+@Mobile+N'%';
 SET @SceneName=N'%'+@SceneName+N'%';
 SET @TicketName=N'%'+@TicketName+N'%';

 SET @PagedSql='SELECT * FROM (' + @PagedSql + ') AS t WHERE RowId BETWEEN '+STR(@StartIndex)+' AND '+STR(@EndIndex);

 IF (@IsRowCount=1)
        BEGIN
   EXEC sp_executesql @RowCountSql,N'@OrderId VARCHAR(10),@AgentId VARCHAR(22), @PayType TINYINT, @Status TINYINT, @BeginTime datetime, @EndTime datetime, @ContactName VARCHAR(17),@Mobile VARCHAR(13),@SceneName VARCHAR(60), @TicketName VARCHAR(62),@RowCount INT OUT',
   @OrderId,@AgentId,@PayType,@Status,@BeginTime,@EndTime,@ContactName,@Mobile,@SceneName,@TicketName,@RowCount OUTPUT
        END
 EXEC sp_executesql @PagedSql,N'@OrderId VARCHAR(10),@AgentId VARCHAR(22), @PayType TINYINT, @Status TINYINT, @BeginTime datetime, @EndTime datetime, @ContactName VARCHAR(17),@Mobile VARCHAR(13),@SceneName VARCHAR(60), @TicketName VARCHAR(62)',
@OrderId,@AgentId,@PayType,@Status,@BeginTime,@EndTime,@ContactName,@Mobile,@SceneName,@TicketName

END

 

3.客户程序端分页sql

public static string GetPagedSql(string tableName, string columnName, string whereString, string sortString, AspNetPager aspNetPager)
        {
            return GetPagedSql(tableName, columnName, whereString, sortString, aspNetPager.PageSize, aspNetPager.CurrentPageIndex, true);
        }
        public static string GetPagedSql(string tableName, string columnName, string whereString, string sortString, AspNetPager aspNetPager, bool isRowCount)
        {
            return GetPagedSql(tableName, columnName, whereString, sortString, aspNetPager.PageSize, aspNetPager.CurrentPageIndex, isRowCount);
        }
        /// <summary>
        /// 获取分页sql(如果当前页索引>实际记录页数,则当前页索引=实际记录页数)
        /// </summary>
        /// <param name="tableName">表名、视图、关联表</param>
        /// <param name="columnName">列名</param>
        /// <param name="whereString">条件语句</param>
        /// <param name="sortString">排序语句</param>
        /// <param name="pageSize">每页记录条数</param>
        /// <param name="pageIndex">当前页索引</param>
        /// <param name="isRowCount">是否需要统计记录条数</param>
        /// <returns>分页sql</returns>
        public static string GetPagedSql(string tableName, string columnName, string whereString, string sortString, int pageSize, int pageIndex, bool isRowCount)
        {
            return string.Format(@"DECLARE @StartIndex INT,@EndIndex INT,@RowCount INT,@PageCount INT;
SET @StartIndex=({1}-1)*{0}+1;SET @EndIndex={1}*{0};
IF {6}=1
BEGIN
    SELECT @RowCount=COUNT(*) FROM {2} {4};
    SET @PageCount=CEILING((@RowCount*1.0)/{0})
    IF @PageCount>0 AND @PageCount<{1}
     BEGIN
      SET @StartIndex=(@PageCount-1)*{0}+1;
      SET @EndIndex=@PageCount*{0};
     END
END               
SELECT * FROM (SELECT ROW_NUMBER() OVER ({5})AS RowId, {3} FROM {2} {4}) AS t WHERE RowId BETWEEN @StartIndex AND @EndIndex;SELECT @RowCount", pageSize, pageIndex, tableName, columnName, whereString, sortString, Convert.ToInt32(isRowCount));
        }
        public static string GetPagedSql1(string tableName, string columnName, string whereString, string sortString, int pageSize, int pageIndex, bool isRowCount)
        {
            int startIndex = pageSize * (pageIndex - 1) + 1;
            int endIndex = pageSize * pageIndex;
            return string.Format(@"SELECT * FROM (SELECT ROW_NUMBER() OVER ({3})AS RowId, {1} FROM {0} {2}) AS t WHERE RowId BETWEEN {4} AND {5};
IF {6}=1 SELECT COUNT(*) FROM {0} {2};", tableName, columnName, whereString, sortString, startIndex, endIndex, Convert.ToInt32(isRowCount));
        }

 

 

 4.页面调用代码

 private void InitControl(bool isRowCount)
    {
        string orderId = this.tbOrderId.Text.Trim();
        string beginDate = this.dpBeginDate.Text;
        string endDate = this.dpEndDate.Text;
        string direction = this.ddlDirection.SelectedValue;
        QueryHelper queryHelper = new QueryHelper();
        StringBuilder whereString = new StringBuilder("WHERE 1=1");
        if (!string.IsNullOrEmpty(orderId))
        {
            whereString.Append(" AND (OLN.OrderId LIKE @OrderId)");
            queryHelper.AddInParameter("@OrderId", string.Format("%{0}%", orderId));
        }
        if (!string.IsNullOrEmpty(beginDate))
        {
            whereString.Append(" AND (OLN.CreateTime >= @BeginDate)");
            queryHelper.AddInParameter("@BeginDate", beginDate);
        }
        if (!string.IsNullOrEmpty(endDate))
        {
            whereString.Append(" AND (OLN.CreateTime < @EndDate)");
            queryHelper.AddInParameter("@EndDate", DateTime.Parse(endDate).AddDays(1));
        }
        if (!string.IsNullOrEmpty(direction))
        {
            whereString.Append(" AND (OLN.Direction = @Direction)");
            queryHelper.AddInParameter("@Direction", direction);
        }

        string tableName = "Orders AS O INNER JOIN OrderLeaveNote AS OLN ON O.OrderId = OLN.OrderId INNER JOIN OrderContact AS OC ON OC.OrderId = OLN.OrderId LEFT JOIN UserOperator AS UO ON OLN.OperatorId = UO.OperatorId ";
        string columnName = "O.OrderType, O.OrderId, OLN.OrderStatus, OLN.Note, OLN.Direction, OLN.OperatorId, OLN.CreateTime, UO.OperatorName, UO.OperatorLoginId, OC.ContactName";
        string sortString = "ORDER BY OLN.OrderId DESC, OLN.CreateTime DESC";
        queryHelper.CommandText = PagedHelper.GetPagedSql(tableName, columnName, whereString.ToString(), sortString, this.AspNetPager1, isRowCount);
        DataSet ds = queryHelper.ExecuteDataSet();
        this.gvOrderLeaveNote.DataSource = ds.Tables[0];
        this.gvOrderLeaveNote.DataBind();
        if (isRowCount)
        {
            this.AspNetPager1.RecordCount = (int)ds.Tables[1].Rows[0][0];
        }
    }
    protected void btnSearch_Click(object sender, EventArgs e)
    {
        this.AspNetPager1.CurrentPageIndex = 1;
        this.InitControl(true);
    }
    protected void AspNetPager1_PageChanged(object sender, EventArgs e)
    {
        this.InitControl(false);
    }

--------------------------------------------------------------------------

private void InitControl(bool isRowCount)
    {
        string orderId = this.tbOrderId.Text;
        string agentId = this.tbAgentId.Text.Trim();
        string payType = this.ddlPayType.SelectedValue;
        string status = this.ddlStatus.SelectedValue;
        byte timeType = this.rbtnReserveDate.Checked ? (byte)0 : (byte)1;
        string beginDate = this.dpBeginDate.Text;
        string endDate = this.dpEndDate.Text;
        string contactName = this.tbContactName.Text.Trim();
        string mobile = this.tbMobile.Text.Trim();
        string sceneName = this.tbSceneName.Text.Trim();
        string ticketName = this.tbTicketName.Text.Trim();

        DbCommand dbCommand = DbHelper.DB.GetStoredProcCommand("PPagedSceneOrder");
        DbHelper.DB.AddInParameter(dbCommand, "OrderId", DbType.String, string.IsNullOrEmpty(orderId) ? DBNull.Value : (object)orderId);
        DbHelper.DB.AddInParameter(dbCommand, "AgentId", DbType.String, string.IsNullOrEmpty(agentId) ? DBNull.Value : (object)agentId);
        DbHelper.DB.AddInParameter(dbCommand, "PayType", DbType.String, string.IsNullOrEmpty(payType) ? DBNull.Value : (object)payType);
        DbHelper.DB.AddInParameter(dbCommand, "Status", DbType.String, string.IsNullOrEmpty(status) ? DBNull.Value : (object)status);
        DbHelper.DB.AddInParameter(dbCommand, "TimeType", DbType.Byte, timeType);
        DbHelper.DB.AddInParameter(dbCommand, "BeginTime", DbType.DateTime, DateTime.Parse(beginDate));
        DbHelper.DB.AddInParameter(dbCommand, "EndTime", DbType.DateTime, DateTime.Parse(endDate).AddDays(1));
        DbHelper.DB.AddInParameter(dbCommand, "ContactName", DbType.String, string.IsNullOrEmpty(contactName) ? DBNull.Value : (object)contactName);
        DbHelper.DB.AddInParameter(dbCommand, "Mobile", DbType.String, string.IsNullOrEmpty(mobile) ? DBNull.Value : (object)mobile);
        DbHelper.DB.AddInParameter(dbCommand, "SceneName", DbType.String, string.IsNullOrEmpty(sceneName) ? DBNull.Value : (object)sceneName);
        DbHelper.DB.AddInParameter(dbCommand, "TicketName", DbType.String, string.IsNullOrEmpty(ticketName) ? DBNull.Value : (object)ticketName);
        DbHelper.DB.AddInParameter(dbCommand, "PageSize", DbType.Int32, this.AspNetPager1.PageSize);
        DbHelper.DB.AddInParameter(dbCommand, "PageIndex", DbType.Int32, this.AspNetPager1.CurrentPageIndex);
        DbHelper.DB.AddInParameter(dbCommand, "@IsRowCount", DbType.Boolean, isRowCount);
        DbHelper.DB.AddOutParameter(dbCommand, "RowCount", DbType.Int32, 4);

        DataTable dt = DbHelper.DB.ExecuteDataSet(dbCommand).Tables[0];
        if (isRowCount)
        {
            this.AspNetPager1.RecordCount = (int)DbHelper.DB.GetParameterValue(dbCommand, "RowCount");
        }
        this.gvOrderScene.DataSource = dt;
        this.gvOrderScene.DataBind();
    }

-------------------------------------------

 private void InitControl()
    {
        string userId = this.tbUserId.Text.Trim();
        string operatorText = this.tbOperator.Text;
        string beginDate = this.dpBeginDate.Text;
        string endDate = this.dpEndDate.Text;
        QueryHelper queryHelper = new QueryHelper();
        StringBuilder whereString = new StringBuilder("WHERE 1=1");
        if (!string.IsNullOrEmpty(userId))
        {
            whereString.AppendFormat(" AND (O.UserId LIKE '{0}')", string.Format("%{0}%", DbHelper.FilterSqlKeyword(DbHelper.FilterBadChar(userId))));
        }
        if (!string.IsNullOrEmpty(operatorText))
        {
            whereString.AppendFormat(" AND (O.OperatorLoginId LIKE '{0}' OR O.OperatorName LIKE '{0}')", string.Format("%{0}%", DbHelper.FilterSqlKeyword(DbHelper.FilterBadChar(operatorText))));
        }
        if (!string.IsNullOrEmpty(beginDate))
        {
            whereString.AppendFormat(" AND L.CreateTime >= '{0}'", DateTime.Parse(beginDate));
        }
        if (!string.IsNullOrEmpty(endDate))
        {
            whereString.AppendFormat(" AND L.CreateTime < '{0}'", DateTime.Parse(endDate).AddDays(1));
        }

        string tableName = "UserLog L LEFT JOIN UserOperator O ON (L.OperatorId=O.OperatorId)";
        string columnName = "L.*,O.UserId,O.OperatorLoginId,O.OperatorName";
        string sortString = "ORDER BY L.LogId DESC";
        DbCommand dbCommand = DbHelper.DB.GetStoredProcCommand("PPagedSql");
        DbHelper.DB.AddInParameter(dbCommand, "TableName", DbType.String, tableName);
        DbHelper.DB.AddInParameter(dbCommand, "ColumnName", DbType.String, columnName);
        DbHelper.DB.AddInParameter(dbCommand, "WhereString", DbType.String, whereString.ToString());
        DbHelper.DB.AddInParameter(dbCommand, "SortString", DbType.String, sortString);
        DbHelper.DB.AddInParameter(dbCommand, "PageSize", DbType.Int32, this.AspNetPager1.PageSize);
        DbHelper.DB.AddInParameter(dbCommand, "PageIndex", DbType.Int32, this.AspNetPager1.CurrentPageIndex);
        DbHelper.DB.AddOutParameter(dbCommand, "RowCount", DbType.Int32, 4);

        DataTable dt = DbHelper.DB.ExecuteDataSet(dbCommand).Tables[0];
        this.AspNetPager1.RecordCount = (int)DbHelper.DB.GetParameterValue(dbCommand, "RowCount");
        this.gvUserLog.DataSource = dt;
        this.gvUserLog.DataBind();
    }

 

 

参考:

http://www.cnblogs.com/wangjun8868/archive/2009/07/10/1520336.html
http://www.cnblogs.com/hinslam/archive/2011/09/01/2161827.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值