通用分页存储过程的使用

本文介绍了一种SQL Server中的通用分页存储过程,并通过示例展示了如何在数据处理层中调用该存储过程实现分析师信息的分页查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看着同事写的通用分页存储过程觉得还不错,分享给大家
1、存储过程
USE [test]
GO
/****** Object:  StoredProcedure [dbo].[ads_GetAll]    Script Date: 07/04/2013 16:00:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo]. [ads_GetAll]   -- 通用分页存储过程
@TableName varchar (50),          --表名
@Fields varchar (5000),      --字段名 (全部字段为*)
@OrderField varchar (5000),          --排序字段( 必须!支持多字段 )
@sqlWhere varchar (5000), --条件语句( 不用加where)
@pageSize int ,                     --每页多少条记录
@pageIndex int = 1 ,             --指定当前为第几页
@COUNT int output             --返回总页数
as
begin
     Begin Tran --开始事务

     Declare @sql nvarchar( 4000);
     Declare @totalRecord int;    

     --计算总记录数
        
     if (@SqlWhere ='' or @sqlWhere =NULL)
         set @sql = 'select @totalRecord = count(*) from ' + @TableName
     else
         set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere

     EXEC sp_executesql @sql, N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数       
   
     --计算总页数
     select @COUNT =CEILING(( @totalRecord+0.0 )/@PageSize)

     if (@SqlWhere ='' or @sqlWhere =NULL)
         set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName
     else
         set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere   
       
   
     --处理页数超出范围情况
     if @PageIndex <=0
         Set @pageIndex = 1
   
     if @pageIndex >@COUNT
         Set @pageIndex = @COUNT

      --处理开始点和结束点
     Declare @StartRecord int
     Declare @EndRecord int
   
     set @StartRecord = (@pageIndex- 1)*@PageSize + 1
     set @EndRecord = @StartRecord + @pageSize - 1

     --继续合成sql 语句
     set @Sql = @Sql + ') as ' + @TableName + ' where rowId between ' + Convert(varchar (50), @StartRecord) + ' and ' +   Convert(varchar (50), @EndRecord)
   
     Exec(@Sql )
     ---------------------------------------------------
     If @@Error <> 0
       Begin
         RollBack Tran
         Return - 1
       End
      Else
       Begin
         Commit Tran
         Return @totalRecord ---返回记录总数
       End   
end



2、数据处理层中:
     /// <summary>
        /// 获取分析师信息并分页
        /// </summary>
        /// <param name="pageSize">每页页数</param>
        /// <param name="count">总个数</param>
        /// <returns></returns>
        public List<Ads_Analyst> ads_Analyst_GetAll(int pageIndex, int pageSize, string where, out int count)
        {
            List<Ads_Analyst> list = new List<Ads_Analyst>();
            IDataReader reader = null;
            IDataParameter[] parameters =  
            
               Helper.GetParameter("@COUNT", DbType.Int32, ParameterDirection.Output),
               Helper.GetParameter("@ReturnValue",DbType.Int32,ParameterDirection.ReturnValue),
               Helper.GetParameter("@PAGESIZE", DbType.Int16,pageSize),
               Helper.GetParameter("@PAGEINDEX", DbType.Int16,pageIndex),
               Helper.GetParameter("@sqlWhere", DbType.String,where),
               Helper.GetParameter("@TableName", DbType.String,"ads_Analyst"),
               Helper.GetParameter("@Fields", DbType.String,"[ID],[AnalystName],[Picture],[JobTitle],[Trade],[Introduction],[Status],[AddTime],[EditTime]"),
               Helper.GetParameter("@OrderField", DbType.String,"AddTime desc"),
            };
            try
            {
                reader = Helper.ExecuteReader
                (
                    ConnectToADS,
                    CommandType.StoredProcedure,
                    "ads_GetAll",
                    parameters
                );
                while (reader.Read())
                {
                    Ads_Analyst m = new Ads_Analyst();
                    m.ID = Field.GetInt32(reader, "ID");
                    m.AnalystName = Field.GetString(reader, "AnalystName");
                    m.Picture = Field.GetString(reader, "Picture");
                    m.JobTitle = Field.GetString(reader, "JobTitle");
                    m.Trade = Field.GetString(reader, "Trade");
                    m.Introduction = Field.GetString(reader, "Introduction");
                    m.AddTime = Field.GetDateTime(reader, "AddTime");
                    m.EditTime = Field.GetDateTime(reader, "EditTime");
                    m.Status = Field.GetInt32(reader, "Status");
                    list.Add(m);
                }
                reader.Close();
                count = (int)parameters[1].Value;
                return list;
            }
            catch (System.Exception ex)
            {
                Logger.Error("获取分析师信息并分页出错", ex);
                throw new DataAccessException("获取分析师信息并分页出错", ex);
            }
            finally
            {
                if (reader != null)
                {
                    reader.Close();
                }
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值