sql 存储过程 分页

来源:互联网 发布:lol mac美服鼠标乱动 编辑:程序博客网 时间:2024/05/29 08:43

-- FUN:存储过程分页
-- @Table nvarchar(255), -- 表名
-- @Fields nvarchar(1000) = ' * ', -- 需要返回的列
-- @OrderField nvarchar(255), -- 排序的字段名,一般为唯一标识
-- @OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
-- @PageSize int = 10, -- 每页有多少条记录
-- @PageIndex int = 1, -- 第几页
-- @Count int output, -- 返回记录总数 
-- @StrWhere nvarchar(1500) -- 查询条件 (注意: 不要加 where,初始化为1=1使得查询条件永远不为空)
----------------------------------------------------------
ALTER PROC [dbo].[PR_pages]
(
 @Table nvarchar(4000), -- 表名
 @Fields nvarchar(1000) = ' * ', -- 需要返回的列
 @OrderField nvarchar(255), -- 排序的字段名,一般为唯一标识
 @OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
 @PageSize int = 10, -- 每页有多少条记录
 @PageIndex int = 1, -- 第几页
 @StrWhere nvarchar(1500), -- 查询条件 (注意: 不要加 where,初始化为1=1使得查询条件永远不为空)
 @Count int output -- 返回记录总数 
)
AS
BEGIN
 DECLARE @StrSQL nvarchar(4000)  -- 主语句
 DECLARE @StrTmp nvarchar(110) -- 临时变量
 DECLARE @StrOrder nvarchar(400) -- 排序类型
 DECLARE @SumSql nvarchar(4000) -- 记录总数
 --SET @StrWhere = ' 1=1 '
 -- 执行总数统计
 SET @SumSql = 'SELECT @Count = COUNT(0) FROM ' + @Table + ' WHERE 1=1 ' + @StrWhere
 EXEC sp_executesql @SumSql,N'@Count int output',@Count output -- 记录总数

 -- 如果@OrderType不是0,就执行降序
 IF @OrderType != 0
  BEGIN
   SET @StrTmp = ' <(SELECT MIN'
   SET @StrOrder = ' ORDER BY [' + @OrderField + '] DESC'
  END
  ELSE
  BEGIN
   SET @StrTmp = ' >(SELECT MAX'
   SET @StrOrder = ' ORDER BY [' + @OrderField + '] ASC'
  END

 -- 如果是第一页就执行以下代码,加快执行速度
 IF @PageIndex = 1
  BEGIN
   SET @StrSQL = 'SELECT TOP ' + STR(@PageSize) +' '+@Fields+ '
   FROM ' + @Table + ' WHERE 1=1 ' + @StrWhere + ' ' + @StrOrder
  END
  ELSE
  BEGIN
 
   --以下代码赋予了@strSQL以真正执行的SQL代码 
   SET @StrSQL = 'SELECT TOP ' + str(@PageSize) +'  '+@Fields+ ' FROM '
   + @Table + ' WHERE 1=1 AND [' + @OrderField + ']' + @StrTmp + '(['
   + @OrderField + ']) FROM (SELECT TOP ' + str((@PageIndex-1)*@PageSize) + ' ['
   + @OrderField + '] from ' + @Table + ' WHERE 1=1 ' + @StrWhere + ' '
   + @StrOrder + ') AS tblTmp) ' + @StrWhere + ' ' + @StrOrder
  END
 --PRINT @StrSQL
 EXEC(@StrSQL)
END

 

 

 

 

2:

   public enum OrderType
    {
        ASC = 0,
        DESC = 1,
    }

 

3:

     public class AppPages
    {
        public AppPages();

        public int Count { get; set; }
        public string Fields { get; set; }
        public string OrderField { get; set; }
        public OrderType OrderType { get; set; }
        public int? PageIndex { get; set; }
        public int PageNum { get; }
        public int PageSize { get; set; }
        public string PrimaryKey { get; set; }
        public string StrWhere { get; set; }
        public string Table { get; set; }
    }

 

 4:

          /// <summary>
        /// 分页
        /// </summary>
        /// <param name="mo_pages"></param>
        /// <returns></returns>
        public DataTable GetPages(AppPages pages)
        {
            SqlParameter[] parms =
            {
                VSHelper.MakeInParam("@Table", SqlDbType.NVarChar, 4000, pages.Table),
                VSHelper.MakeInParam("@Fields",SqlDbType.NVarChar,1000,pages.Fields),
                VSHelper.MakeInParam("@OrderField",SqlDbType.NVarChar,255,pages.OrderField),
                VSHelper.MakeInParam("@OrderType",SqlDbType.Int,4,pages.OrderType),
                VSHelper.MakeInParam("@PageSize",SqlDbType.Int,4,pages.PageSize),
                VSHelper.MakeInParam("@PageIndex",SqlDbType.Int,4,pages.PageIndex),
                VSHelper.MakeInParam("@StrWhere",SqlDbType.NVarChar,1500,pages.StrWhere),
                VSHelper.MakeOutParam("@Count",SqlDbType.Int,4)
            };

            DataTable dt = VSHelper.ExecProcDataTable("PR_pages", parms);
            pages.Count = int.Parse(parms[7].Value.ToString());
            return dt;
        }

原创粉丝点击