位置: 编程技术 - 正文

通用分页存储过程,源码共享,大家共同完善(分页式存储管理中页的大小是可以不相等的)

编辑:rootadmin
好久没有上来写点东西了,今天正好有空,共享一些个人心得,就是关于分页的存储过程,这个问题应该是老生重谈了,网上的通用存储过程的类型已经够多了,但是,好象看到的基本上不能够满足一些复杂的SQL语句的分页(也可能是我不够见多识广啊,呵呵),比如下面这句: select '' as CheckBox, A.TargetID, A.TargetPeriod, Convert(varchar(), B.BeginDate, ) as BeginDate, Convert(varchar(), B.EndDate, ) as EndDate, C.SalesCode, C.SalesName, D.CatalogCode, D.CatalogName, E.OrgID, E.OrgName, F.OrgID as BranchOrgID, F.OrgCode as BranchOrgCode, F.OrgName as BranchOrgName, A.Amount, '' as DetailButton from ChlSalesTarget as A left outer join ChlSalesTargetPeriod as B on A.TargetPeriod=B.TargetPeriod left outer join ChlSales as C on A.Sales=C.SalesCode left outer join ChlItemCatalog as D on A.ItemCatalog=D.CatalogCode left outer join ChlOrg as E on A.OrgID=E.OrgID left outer join ChlOrg as F on C.BranchOrgID=F.OrgID where A.TargetPeriod >='' and A.TargetPeriod <='' and F.OrgCode like '%%' and E.OrgCode like '%%' order by A.TargetPeriod desc,C.SalesName,D.CatalogName上面这句SQL里面有一些特殊情况,比如使用了Convert函数,而且没有主键,有多表连接,有表别名,字段别名等等,这些情况处理起来可能比较棘手,当然,其中的“'' as CheckBox”是我系统当中的特例情况,用来做一些处理的。 我这里提供一个自己开发的通用分页存储过程,有什么好的建议和意见,大家请不吝指教。代码如下: 通用分页存储过程----Sp_Paging /**//* ============================================================ 功能: 通用分页存储过程 参数: @PK varchar(), 主键,用来排序的单一字段,空的话,表示没有主键,存储过程将自动创建标识列主键 @Fields varchar(), 要显示的字段列表(格式如:ID,Code,Name) @Tables varchar(), 要使用的表集合(Org) @Where varchar(), 查询条件(Code like '') @OrderBy varchar(), 排序条件(支持多个排序字段,如:ID,Code desc,Name desc) @PageIndex int, 当前要显示的页的页索引,索引从1开始,无记录时为0。 @PageSize int, 页大小 创建者:Hollis Yao 创建日期:-- 备注: ============================================================ */ Create PROCEDURE [dbo].[Sp_Paging] @PK varchar()='', @Fields varchar(), @Tables varchar(), @Where varchar()='', @OrderBy varchar(), @PageIndex int, @PageSize int AS --替换单引号,避免构造SQL出错 set @Fields = replace(@Fields, '''', '''''') --要执行的SQL,切分为几个字符串,避免出现长度超过4k时的问题 declare @SQL1 varchar() declare @SQL2 varchar() set @SQL1 = '' set @SQL2 = '' if @Where is not null and len(ltrim(rtrim(@Where))) > 0 set @Where = ' where ' + @Where else set @Where = ' where 1=1' set @SQL1 = @SQL1 + ' declare @TotalCount int' --声明一个变量,总记录数 set @SQL1 = @SQL1 + ' declare @PageCount int' --声明一个变量,总页数 set @SQL1 = @SQL1 + ' declare @PageIndex int' --声明一个变量,页索引 set @SQL1 = @SQL1 + ' declare @StartRow int' --声明一个变量,当前页第一条记录的索引 set @SQL1 = @SQL1 + ' select @TotalCount=count(*) from ' + @Tables + @Where --获取总记录数 set @SQL1 = @SQL1 + ' if @PageCount <= 0 begin' --如果记录数为0,直接输出空的结果集 set @SQL1 = @SQL1 + ' select ' + @Fields + ' from ' + @Tables + ' where 1<>1' set @SQL1 = @SQL1 + ' select 0 as PageIndex,0 as PageCount,' + convert(varchar, @PageSize) + ' as PageSize,0 as TotalCount' set @SQL1 = @SQL1 + ' return end' set @SQL1 = @SQL1 + ' set @PageCount=(@TotalCount+' + convert(varchar, @PageSize) + '-1)/' + convert(varchar, @PageSize) --获取总页数 set @SQL1 = @SQL1 + ' set @PageIndex=' + convert(varchar, @PageIndex) --设置正确的页索引 set @SQL1 = @SQL1 + ' if @PageIndex<0 set @PageIndex=1' set @SQL1 = @SQL1 + ' if @PageIndex>@PageCount and @PageCount>0 set @PageIndex=@PageCount' set @SQL1 = @SQL1 + ' set @StartRow=(@PageIndex-1)*' + convert(varchar, @PageSize) + '+1' if (charindex(',', @OrderBy)=0 and charindex(@PK, @OrderBy)>0) begin --**************************************************************************** --****************不需要创建主键******************************************** --**************************************************************************** declare @SortDirection varchar() --排序方向,>=:升序,<=:倒序 set @SortDirection = '>=' if charindex('desc', @OrderBy) > 0 set @SortDirection = '<=' set @SQL2 = @SQL2 + ' declare @Sort varchar()' --声明一个变量,用来记录当前页第一条记录的排序字段值 set @SQL2 = @SQL2 + ' set rowcount @StartRow' --设置返回记录数截止到当前页的第一条 set @SQL2 = @SQL2 + ' select @Sort=' + @PK + ' from ' + @Tables + @Where + ' order by ' + @OrderBy --获取当前页第一个排序字段值 set @SQL2 = @SQL2 + ' set rowcount ' + convert(varchar, @PageSize) --设置返回记录数为页大小 set @Where = @Where + ' and ' + @PK + @SortDirection + '@Sort' set @SQL2 = @SQL2 + ' select ' + @Fields + ' from ' + @Tables + @Where + ' order by ' + @OrderBy --输出最终显示结果 end else begin --**************************************************************************** --*************需要创建自增长主键****************************************** --**************************************************************************** set @SQL2 = @SQL2 + ' declare @EndRow int' set @SQL2 = @SQL2 + ' set @EndRow=@PageIndex*' + convert(varchar, @PageSize) set @SQL2 = @SQL2 + ' set rowcount @EndRow' set @SQL2 = @SQL2 + ' declare @PKBegin int' --声明一个变量,开始索引 set @SQL2 = @SQL2 + ' declare @PKEnd int' --声明一个变量,结束索引 set @SQL2 = @SQL2 + ' set @PKBegin=@StartRow' set @SQL2 = @SQL2 + ' set @PKEnd=@EndRow' --**************************************************************************** --************对特殊字段进行转换,以便可以插入到临时表****************** --**************************************************************************** declare @TempFields varchar() set @TempFields=@Fields set @TempFields = replace(@TempFields, ''''' as CheckBox', '') set @TempFields = replace(@TempFields, ''''' as DetailButton', '') set @TempFields = replace(@TempFields, ''''' as Radio', '') set @TempFields = LTRIM(RTRIM(@TempFields)) if left(@TempFields,1)=',' --去除最左边的逗号 set @TempFields = substring(@TempFields, 2, len(@TempFields)) if right(@TempFields,1)=',' --去除最右边的逗号 set @TempFields = substring(@TempFields, 1, len(@TempFields)-1) set @SQL2 = @SQL2 + ' select identity(int,1,1) as PK,' + @TempFields + ' into #tb from ' + @Tables + @Where + ' order by ' + @OrderBy --**************************************************************************** --********去除字段的表名前缀,当有字段有别名时,只保留字段别名********* --**************************************************************************** declare @TotalFields varchar() declare @tmp varchar() declare @i int declare @j int declare @iLeft int --左括号的个数 declare @iRight int --右括号的个数 set @i = 0 set @j = 0 set @iLeft = 0 set @iRight = 0 set @tmp = '' set @TotalFields = '' while (len(@Fields)>0) begin set @i = charindex(',', @Fields) --去除字段的表名前缀 if (@i=0) begin --找不到逗号分割,即表示只剩下最后一个字段 set @tmp = @Fields end else begin set @tmp = substring(@Fields, 1, @i) end set @j = charindex('.', @tmp) if (@j>0) set @tmp = substring(@tmp, @j+1, len(@tmp)) --*******当有字段有别名时,只保留字段别名********* --带括号的情况要单独处理,如Convert(varchar(), B.EndDate, ) as EndDate while (charindex('(', @tmp) > 0) begin set @iLeft = @iLeft + 1 set @tmp = substring(@tmp, charindex('(', @tmp)+1, Len(@tmp)) end while (charindex(')', @tmp) > 0) begin set @iRight = @iRight + 1 set @tmp = substring(@tmp, charindex(')', @tmp)+1, Len(@tmp)) end --当括号恰好组队的时候,才能进行字段别名的处理 if (@iLeft = @iRight) begin set @iLeft = 0 set @iRight = 0 --不对这几个特殊字段作处理:CheckBox、DetailButton、Radio if (charindex('CheckBox', @tmp) = 0 and charindex('DetailButton', @tmp) = 0 and charindex('Radio', @tmp) = 0) begin --判断是否有别名 if (charindex('as', @tmp) > 0)--别名的第一种写法,带'as'的格式 begin set @tmp = substring(@tmp, charindex('as', @tmp)+2, len(@tmp)) end else begin if (charindex(' ', @tmp) > 0)--别名的第二种写法,带空格(" ")的格式 begin while(charindex(' ', @tmp) > 0) begin set @tmp = substring(@tmp, charindex(' ', @tmp)+1, len(@tmp)) end end end end set @TotalFields = @TotalFields + @tmp end if (@i=0) set @Fields = '' else set @Fields = substring(@Fields, @i+1, len(@Fields)) end --print @TotalFields set @SQL2 = @SQL2 + ' select ' + @TotalFields + ' from #tb where PK between @PKBegin and @PKEnd order by PK' --输出最终显示结果 set @SQL2 = @SQL2 + ' drop table #tb' end --输出“PageIndex(页索引)、PageCount(页数)、PageSize(页大小)、TotalCount(总记录数)” set @SQL2 = @SQL2 + ' select @PageIndex as PageIndex,@PageCount as PageCount,' + convert(varchar, @PageSize) + ' as PageSize,@TotalCount as TotalCount' --print @SQL1 + @SQL2 exec(@SQL1 + @SQL2) 如果使用这个通用分页存储过程的话,那么调用方法如下: 使用通用分页存储过程进行分页 /**//* ============================================================ 功能: 获取销售目标,根据条件 参数: @UserType int, @OrgID varchar(), @TargetPeriodBegin nvarchar(), @TargetPeriodEnd nvarchar(), @BranchOrgCode nvarchar(), @BranchOrgName nvarchar(), @OrgCode nvarchar(), @OrgName nvarchar(), @SalesCode nvarchar(), @SalesName nvarchar(), @CatalogCode nvarchar(), @CatalogName nvarchar(), @PageIndex int, 当前要显示的页的页索引,索引从1开始,无记录时为0。 @PageSize int, 页大小 创建者:Hollis Yao 创建日期:-- 备注: ============================================================ */ Create PROCEDURE [dbo].[GetSalesTargetList] @UserType int, @OrgID nvarchar(), @TargetPeriodBegin nvarchar(), @TargetPeriodEnd nvarchar(), @BranchOrgCode nvarchar(), @BranchOrgName nvarchar(), @OrgCode nvarchar(), @OrgName nvarchar(), @SalesCode nvarchar(), @SalesName nvarchar(), @CatalogCode nvarchar(), @CatalogName nvarchar(), @PageIndex int, @PageSize int AS declare @Condition nvarchar() set @Condition = '' if (@UserType<>1) set @Condition = @Condition + ' and A.OrgID in (' + @OrgID + ')' if (len(@TargetPeriodBegin)>0) set @Condition = @Condition + ' and A.TargetPeriod >=''' + @TargetPeriodBegin + '''' if (len(@TargetPeriodEnd)>0) set @Condition = @Condition + ' and A.TargetPeriod <=''' + @TargetPeriodEnd + '''' if (len(@BranchOrgCode)>0) set @Condition = @Condition + ' and F.OrgCode like ''%' + @BranchOrgCode + '%''' if (len(@BranchOrgName)>0) set @Condition = @Condition + ' and F.OrgName like ''%' + @BranchOrgName + '%''' if (len(@OrgCode)>0) set @Condition = @Condition + ' and E.OrgCode like ''%' + @OrgCode + '%''' if (len(@OrgName)>0) set @Condition = @Condition + ' and E.OrgName like ''%' + @OrgName + '%''' if (len(@SalesCode)>0) set @Condition = @Condition + ' and C.SalesCode like ''%' + @SalesCode + '%''' if (len(@SalesName)>0) set @Condition = @Condition + ' and C.SalesName like ''%' + @SalesName + '%''' if (len(@CatalogCode)>0) set @Condition = @Condition + ' and D.CatalogCode like ''%' + @CatalogCode + '%''' if (len(@CatalogName)>0) set @Condition = @Condition + ' and D.CatalogName like ''%' + @CatalogName + '%''' if (len(@Condition)>0) set @Condition = substring(@Condition,5,len(@Condition)) --print @Condition exec sp_Paging N'',N''' as CheckBox, A.TargetID, A.TargetPeriod, Convert(varchar(), B.BeginDate, ) as BeginDate, Convert(varchar(), B.EndDate, ) as EndDate, C.SalesCode, C.SalesName, D.CatalogCode, D.CatalogName, E.OrgID, E.OrgName, F.OrgID as BranchOrgID, F.OrgCode as BranchOrgCode, F.OrgName as BranchOrgName, A.Amount, '' as DetailButton', N'ChlSalesTarget as A left outer join ChlSalesTargetPeriod as B on A.TargetPeriod=B.TargetPeriod left outer join ChlSales as C on A.Sales=C.SalesCode left outer join ChlItemCatalog as D on A.ItemCatalog=D.CatalogCode left outer join ChlOrg as E on A.OrgID=E.OrgID left outer join ChlOrg as F on C.BranchOrgID=F.OrgID', @Condition, N'A.TargetPeriod desc,C.SalesName,D.CatalogName', @PageIndex, @PageSize

推荐整理分享通用分页存储过程,源码共享,大家共同完善(分页式存储管理中页的大小是可以不相等的),希望有所帮助,仅作参考,欢迎阅读内容。

通用分页存储过程,源码共享,大家共同完善(分页式存储管理中页的大小是可以不相等的)

文章相关热门搜索词:分页存储系统,分页存储方式,分页式存储相关例题,分页式存储管理中页的大小是可以不相等的,分页式存储管理中页的大小是可以不相等的,分页存储的优缺点,分页存储系统,通用分页存储过期怎么办,内容如对您有帮助,希望把文章链接给更多的朋友!

SQL查找某一条记录的方法 SQL查找第n条记录的方法:selecttop1*fromtablewhereidnotin(selecttopn-1idfromtable)temptable0SQL查找第n条开始的m条记录的方法:selecttopm*fromtablewhereidnotin(selecttopn-1idfromtable

使用 GUID 值来作为数据库行标识讲解 GUID(Globaluniqueidentifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及CPU时钟的唯一数字生成的的一个字节的二进制值

非常详细的SQL--JOIN之完全用法 外联接。外联接可以是左向外联接、右向外联接或完整外部联接。在FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:LEFTJOIN或LEFTOUTERJOIN

标签: 分页式存储管理中页的大小是可以不相等的

本文链接地址:https://www.jiuchutong.com/biancheng/348417.html 转载请保留说明!

上一篇:一个SQL语句获得某人参与的帖子及在该帖得分总和(sql获取某个字符的位置)

下一篇:SQL查找某一条记录的方法(sql查询一条数据)

  • 进出口环节增值税计税基础
  • 个人所得税网上申报
  • 合营企业和联营企业的持股比例
  • 税申报后未交款是否可撤销?
  • 个税按照计提申报怎么调整
  • 企业年报 工商
  • 从商业企业购进商品
  • 房产税和土地使用税会计分录
  • 交通补贴补贴可以税前扣除吗?
  • 授予股票期权分录
  • 货车挂靠企业需要交增值税吗?
  • 水利建设基金怎么计提
  • 为什么盈利的企业也有可能发生债务危机
  • 在建工程完工,并当日签订出租协议的会计分录
  • 一般纳税人普通发票要交增值税吗
  • 小微企业增值税减免账务处理
  • 哪些收入应计入成本
  • 交通定额发票税率
  • 购进货物赠送客户增值税处理
  • 普惠性税收优惠政策包括
  • 房地产企业申请破产,原来的购房合同还有效吗?
  • 黄金入账怎么做会计分录
  • 股权转让投资款怎么入账
  • win10永久激活码神key一周内
  • 怎么扣除税费
  • 不动产税费
  • php转word
  • 闲置私家车出租APP
  • 原始凭证容易出现错误的原因
  • 购买股票会计分录怎么写
  • 产品成本核算应正确划分哪些方面的费用界限
  • php获取数据
  • thinkphp配置文件
  • 暂估入库的商品能出库吗
  • 工具人
  • 企业其他应付款太多怎么办
  • 工资必须走银行卡吗
  • 机器学习期末复习题
  • 如何构建自己的精神空间
  • 用php编写一个简单的计算器程序
  • 出口退税进项税额转出怎么申报
  • 中华人民共和国禁毒法第十三条规定
  • 利息支出税前扣除时间
  • 收回多发的工资在上缴财政,可以用应缴财政款科目吗
  • 总公司发票可以从分公司付款吗
  • Fatal error: Call to undefined function mysqli_init() in 路径
  • sql语句表中增加一列
  • sql2012存储过程
  • mysql出现箭头
  • SQL中DATEADD和DATEDIFF的用法示例介绍
  • 水费差额缴税如何计算
  • 分公司是否具有独立承担民事责任的能力
  • 企业所得税如何规避
  • 研究费用记入什么费用
  • 将购进药品销售给药品生产企业或药品经营企业的是
  • 固定资产没有发票
  • 年金现值和年金终值的例题
  • 事业单位实收资本如何做账
  • 年初余额和期末余额对不上怎么办
  • 投资收益的账务怎么处理
  • sql语句的子查询
  • w10专业版最新版本
  • window7发布
  • 苹果14pro max价格
  • win11玩dota2
  • 无需u盘安装系统
  • sql2000停止拒绝访问
  • 电脑没有声音了是怎么回事
  • extjs3 combobox取value和text案例详解
  • 杂志内页广告
  • opengl绘图
  • python pdf操作
  • sql命令语句
  • java中关联关系
  • display getSize()
  • 国家税务局网发票查验
  • 收到虚开的增值税专用发票
  • 郑州市国家税务局
  • 杭州汽车摇号中签率多少
  • 深圳国税总局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设