重新编译后嵌套的存储过程无法正常工作

时间:2016-10-29 04:33:04

标签: sql sql-server tsql stored-procedures

我有一个奇怪的问题。我有一个内部调用另一个过程的存储过程。这已经有一段时间没有问题了。现在,当我更改内部存储过程并重新编译它时,外部过程会跳过内部过程并抛出错误。我已经尝试过调试它,它只是跨过内部过程而不是它。

然而,真正奇怪的是,如果我然后通过Excel或SMSS客户端自行运行内部过程。然后外部proc将开始正确运行。我试图将WITH RECOMPILE添加到过程调用中,并且行为有任何变化。关于发生了什么的任何想法?

1 个答案:

答案 0 :(得分:1)

如果在两个过程中都有#temp个具有相同名称的表,则会发生这种情况。

在这种情况下重命名它们以避免命名冲突。以下是一个例子。

CREATE PROC P2
AS 
SELECT 1 AS Y INTO #T
SELECT Y FROM #T

GO

CREATE PROC P1
AS 
SELECT 1 AS X INTO #T
EXEC P2

GO

EXEC P2; /*Run P2 first so the plan is cached*/
EXEC P1; /*This executes fine*/

EXEC sp_recompile 'P2' /*Mark P2 for recompilation*/
EXEC P1 /* Attempt to recompile P2 fails with  "Invalid column name
          'Y' as a table called #T without this column already exists at outer scope."*/