SQL Server 异常解决:语句被终止。完成执行语句前已用完最大递归 100。

问题出现业务场景:

  我司有个缺料分析报表,有一个字段是适用机种,需要通过BOM递归读取顶层父物料。这个错就是缺料分析报表执行时报的错;

原因分析定位:

  通过网上一些资料,猜测应该是某个递归查询语句,遇到死循环了。所以看了一遍整个存储过程大体猜测应该是适用机种的程序出错。单独注释这个程序,整个报表立马运行正常。

  接着继续看代码,果然有一段递归查询语句:

1  with cte(cnumber,cname,pnumber,fname) as
2  (
3   select cnumber,cname,pnumber,fname from #bompc
4   where cnumber=@fnumber
5   union all
6   select ct.cnumber,ct.cname,ct.pnumber,ct.fname from cte tt inner join #bompc ct
7   on tt.pnumber=ct.cnumber
8   )
9   insert into #bomtemp select * from cte

问题解决:

  发现了出错代码,还需要知道是哪个物料出问题了。由于程序是一次性运行所有的物料。所以考虑加入try catch

 1 BEGIN TRY
 2  --递归找出父料
 3  with cte(cnumber,cname,pnumber,fname) as
 4  (
 5   select cnumber,cname,pnumber,fname from #bompc
 6   where cnumber=@fnumber
 7   union all
 8   select ct.cnumber,ct.cname,ct.pnumber,ct.fname from cte tt inner join #bompc ct
 9   on tt.pnumber=ct.cnumber
10   )
11   insert into #bomtemp select * from cte
12 END TRY
13 BEGIN CATCH
14     PRINT '运行到物料发生异常: '+@fnumber;
15         SELECT
16         ERROR_NUMBER() AS ErrorNumber,
17         ERROR_SEVERITY() AS ErrorSeverity,
18         ERROR_STATE() AS ErrorState,
19         ERROR_PROCEDURE() AS ErrorProcedure,
20         ERROR_LINE() AS ErrorLine,
21         ERROR_MESSAGE() AS ErrorMessage;
22     RETURN -1;
23 END CATCH

单独调用这个存储过程,终于发现了出错物料。果然和猜测的一样。子记录引用了父记录,父记录又引用了子记录。

将错误数据删除后,问题解决!

原文地址:https://www.cnblogs.com/namelessmyth/p/9338000.html