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
单独调用这个存储过程,终于发现了出错物料。果然和猜测的一样。子记录引用了父记录,父记录又引用了子记录。
将错误数据删除后,问题解决