SQL存储过程无法识别临时表问题排查求助
问题根源确认与分析
最终定位到问题是由一行未被注意到的代码引发的:select * from pbiMaster,这行代码的添加时间暂不明确,但确实是报错的直接原因,且并非临时表作用域问题。
原问题现象
原本正常运行的SQL查询突然报「无效对象(临时表不存在)」错误,报错发生在主查询调用的存储过程spGSP_PBI_MktFinSum_ARDaysOut_UnbilledRevenue中。主查询的逻辑是:
- 检查临时表
#PBI_MktFinSum_ARDaysOut_ReportRows是否存在,存在则删除 - 创建该临时表
- 调用存储过程,但存储过程无法找到这个临时表
主查询代码:
if object_id('tempdb..#PBI_MktFinSum_ARDaysOut_ReportRows') is not null drop table #PBI_MktFinSum_ARDaysOut_ReportRows CREATE TABLE #PBI_MktFinSum_ARDaysOut_ReportRows (Period int, Org nvarchar(10) , TotalARBalance decimal(19,5), TotalAROver90 decimal(19,5), PctOver90 decimal(19,5), TotalRetainage decimal(19,5) , JTDUnbilled decimal(19,5) , TotalRevenue decimal(19,5), DailyAvgRevenue decimal(19,5) , DaysOut decimal(19,5)) EXEC spGSP_PBI_MktFinSum_ARDaysOut_UnbilledRevenue
存储过程中触发报错的代码段:
UPDATE pbiMaster SET pbiMaster.TotalRevenue = Coalesce(grossRev.TotalRevenue, 0), pbiMaster.DailyAvgRevenue = Coalesce(grossRev.DailyAvg, 0) FROM #PBI_MktFinSum_ARDaysOut_ReportRows as pbiMaster left join #SP_PBI_MktFinSum_ARDaysOut_GrossRev_90SumsFromReportRows grossRev on pbiMaster.Period = grossRev.Period and pbiMaster.Org = grossRev.Org
问题触发背景
代码本身未做变更,仅曾注释掉存储过程调用语句单独执行主查询,之后恢复调用就出现了该问题。当时的现象是临时表仅能在主查询内部被识别,外部存储过程调用时无法找到。
根源解析
那行额外的select * from pbiMaster是祸根:pbiMaster是存储过程里临时表的别名,这行代码被添加后,SQL Server编译存储过程时会先尝试解析这个pbiMaster对应的对象。由于这行代码并不指向任何实际存在的表(既不是永久表也不是正确定义的临时表),编译阶段就会抛出对象不存在的错误,而错误提示会被误导指向原本正确引用的#PBI_MktFinSum_ARDaysOut_ReportRows临时表,让排查方向跑偏到作用域问题上。
内容的提问来源于stack exchange,提问作者Ethan Pelton
相关产品推荐
相关产品推荐

