我们的一个存储过程出现奇怪的错误。此存储过程调用其他存储过程,我们收到与在子过程中找不到的列相关的错误。例如:
Exec StoredProc1, this stored proc calls StoredProc2, StoredProc3 & StoredProc4
当我第一次执行 StoredProc1 时,我收到与 StoredProc2 上的列相关的错误。然后我直接执行 StoredProc2 并且它工作,然后我再次调用 StoredProc1 并且它抱怨 StoredProc3 上的列错误,等等。
我猜这与 SQL Server 如何为 StoredProc1 缓存其执行计划有关,并且依次执行每个存储过程会强制更新存储计划/依赖项。
我怎样才能全面纠正这个问题?
如果我一次执行每个依赖过程,然后执行它起作用的父过程。如果我然后运行这些命令:
CHECKPOINT;
DBCC DROPCLEANBUFFERS;
DBCC FREEPROCCACHE;
并执行父过程我再次收到错误。
存储过程都使用同名的临时表,但如果我理解正确的话,因为它们在不同的过程中,它们将创建单独的表。
感谢 SQL Kiwi,您回答了我的问题。临时表都是#temp 表。阅读您的评论后,我想为什么不尝试重命名所有临时表并使每个临时表都有一个唯一的名称。
我考虑了每个过程并为每个#temp 表每个存储过程一个唯一的名称,然后我运行了命令
然后再次尝试运行我的主要程序,一切似乎都再次正常工作。SQL 必须与所有存储过程中相同的临时表名称混淆。我无法解释的是为什么从 SSRS 服务器执行报告,而从 SSMS 我得到错误(仅在我们的实时环境中)
不幸的是,我已经从一家外包开发公司接管了这个系统,我不会按照他们的方式做事。我一直在慢慢地用 CTE 替换一些临时表并重新分解一些不必要的连接,在大多数情况下,这给了我们更好的性能。