首页 > 数据库 >SQLServer CTE 递归查询限制递归级数(完成执行语句前已用完最大递归)

SQLServer CTE 递归查询限制递归级数(完成执行语句前已用完最大递归)

时间:2022-12-08 15:46:58浏览次数:84  
标签:语句 递归 cte sxh SQLServer 查询 CTE 科目

SQLServer CTE 递归查询限制递归级数(完成执行语句前已用完最大递归)

介绍

如果递归 CTE 组合不正确,可能会导致无限循环。 例如,如果递归成员查询定义对父列和子列返回相同的值,则会造成无限循环。 可以使用 MAXRECURSION 来限制特定语句所允许的递归级数,以防止出现无限循环。 这样就能够在解决产生循环的代码问题之前控制语句的执行。

MAXRECURSION <integer_value>

指定该查询允许的最大递归数。 <integer_value> 是介于 0 至 32,767 之间的非负整数。 如果指定 0,则没有限制。 如果未指定此选项,服务器的默认限制为 100。

如果在查询执行期间达到指定或默认的 MAXRECURSION 数量限制,查询结束并返回错误。

由于此错误,该语句的所有结果都被回滚。 如果该语句为 SELECT 语句,则可能会返回部分结果或不返回结果。 所返回的任何部分结果都可能无法包括超过指定最大递归级别的递归级别上的所有行。

参考文档

递归公用表表达式的准则

MAXRECURSION

示例

创建测试数据

create table #ceshi(id int, pid int, mc varchar(20))
insert into #ceshi
  values(1, 0, '1级科目_1'), (2, 0, '1级科目_2'),
        (3, 1, '2级科目_1'), (4, 2, '2级科目_2'), 
		(5, 3, '3级科目_1'), (6, 4, '3级科目_2'), 
		(7, 5, '4级科目_1'), (8, 6, '4级科目_2') 

设置只递归查询2次(默认值为 100)

WITH 
  cte AS
  (Select *, id * 10 sxh from #ceshi where pid = 0
   union all
   Select A.*, sxh + 1 from #ceshi A INNER JOIN cte B ON A.pid = B.id
)
select * from cte order by sxh OPTION (MAXRECURSION 2)

错误提示

消息 530,级别 16,状态 1,第 1 行
语句被终止。完成执行语句前已用完最大递归 2。

修改为不限制递归查询次数

WITH 
  cte AS
  (Select *, id * 10 sxh from #ceshi where pid = 0
   union all
   Select A.*, sxh + 1 from #ceshi A INNER JOIN cte B ON A.pid = B.id
)
select * from cte order by sxh OPTION (MAXRECURSION 0)

查询结果

id pid mc sxh
1 0 1级科目_1 10
3 1 2级科目_1 11
5 3 3级科目_1 12
7 5 4级科目_1 13
2 0 1级科目_2 20
4 2 2级科目_2 21
6 4 3级科目_2 22
8 6 4级科目_2 23

标签:语句,递归,cte,sxh,SQLServer,查询,CTE,科目
From: https://www.cnblogs.com/txgh/p/16966254.html

相关文章

  • 用递归函数实现树形结构转化为列表数据
    题目:  将下面的树结构的数据转化为列表的数据。[{"name":"北京市","code":"11","children":[{"name":"市辖区","code":"1101","children":[{"name":"......
  • dotnet使用sqlserver作为session server
    cdC:\Windows\Microsoft.NET\Framework\v4.0.30319aspnet_regsql.exe-Sdevelopserver-Usa-P1234-ssadd-daspnet_state-sstypec <system.web><sessionState......
  • 算法-递归&分治
    一、递归0、递归概述为什么要用递归而不用循环:​ 以n的阶乘为例,确实使用循环会更方便,但是使用递归的场景,一般是比较难以确认推导路径的,例如一棵树,要获取所有节点值的和,......
  • js递归的使用
    在js中函数自己调用自己,就称为递归。递归函数的必要条件递归方程以及递归结束条件,即给递归函数安排出口,否则会造成无限递归,无限递归会造成执行栈溢出,浏览器会报错。递归......
  • 5、mybatis连接sqlserver数据库
    1          在idea的maven项目下,使用mybatis连接sqlserver数据库 2          下载Sqljdbc4.jar包2.1         地址:​​http://mvnrepository......
  • MYSQL5.7实现递归查询
    根据父id查出所有子级,包括子级的子级,包括自身的idsys_tenant_company_relation为关联表,company_id为子id,parent_company_id为父idSELECTDATA.*FROM(......
  • SQLServer日期格式化
    SqlServer中一个非常强大的日期格式化函数SelectCONVERT(varchar(100),GETDATE(),0):0516200610:57AMSelectCONVERT(varchar(100),GETDATE(),1):05/1......
  • Vscode——报错解决:Unable to start debugging.Unexpected GDB output from command.
    一、报错截图1.Unabletostartdebugging.UnexpectedGDBoutputfromcommand.2.程序点击运行一直无结果二、原因路径中含有中文。三、解决办法将文件放入不包含中文的......
  • C——error: expected ‘:‘, ‘,‘, ‘;‘, ‘}‘ or ‘__attribute__‘ before ‘=‘
    一、原因结构体中包含变量的初始化。二、报错代码structGaitParams{floatstance_height=0.18;//Desiredheightofbodyfromgroundduringwalking(m)flo......
  • SQLSERVER中RANK OVER(PARTITION BY)的用法
    https://blog.csdn.net/weixin_41896770/article/details/107625845一张学生表【姓名、班级、分数】,查询出每个班级成绩排第一的同学(按照班级的分数排名)其中RANK()OVER(......