![SQL Server 异常解决:语句被终止。完成执行语句前已用完最大递归 100。 SQL Server 异常解决:语句被终止。完成执行语句前已用完最大递归 100。](https://image.shishitao.com:8440/aHR0cHM6Ly9ia3FzaW1nLmlrYWZhbi5jb20vdXBsb2FkL2NoYXRncHQtcy5wbmc%2FIQ%3D%3D.png?!?w=700&webp=1)
问题出现业务场景:
我司有个缺料分析报表,有一个字段是适用机种,需要通过BOM递归读取顶层父物料。这个错就是缺料分析报表执行时报的错;
原因分析定位:
通过网上一些资料,猜测应该是某个递归查询语句,遇到死循环了。所以看了一遍整个存储过程大体猜测应该是适用机种的程序出错。单独注释这个程序,整个报表立马运行正常。
接着继续看代码,果然有一段递归查询语句:
with cte(cnumber,cname,pnumber,fname) as
(
select cnumber,cname,pnumber,fname from #bompc
where cnumber=@fnumber
union all
select ct.cnumber,ct.cname,ct.pnumber,ct.fname from cte tt inner join #bompc ct
on tt.pnumber=ct.cnumber
)
insert into #bomtemp select * from cte
问题解决:
发现了出错代码,还需要知道是哪个物料出问题了。由于程序是一次性运行所有的物料。所以考虑加入try catch
BEGIN TRY
--递归找出父料
with cte(cnumber,cname,pnumber,fname) as
(
select cnumber,cname,pnumber,fname from #bompc
where cnumber=@fnumber
union all
select ct.cnumber,ct.cname,ct.pnumber,ct.fname from cte tt inner join #bompc ct
on tt.pnumber=ct.cnumber
)
insert into #bomtemp select * from cte
END TRY
BEGIN CATCH
PRINT '运行到物料发生异常: '+@fnumber;
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;
RETURN -1;
END CATCH
单独调用这个存储过程,终于发现了出错物料。果然和猜测的一样。子记录引用了父记录,父记录又引用了子记录。
将错误数据删除后,问题解决!