2016-10-29 2 views
0

У меня есть странная проблема. У меня есть хранимая процедура, которая внутренне вызывает другую процедуру. Это довольно долгое время работало без проблем. Теперь, когда я делаю изменения во внутренней хранимой процедуре и перекомпилирую ее, внешняя процедура пропускает внутреннюю процедуру и бросает ошибки. Я пробовал отлаживать его, и он просто перешагивает внутренний процесс, а не в него.Вложенная хранимая процедура не работает после перекомпиляции

Действительно странная вещь, однако, если я затем запускаю внутреннюю процедуру самостоятельно, либо через клиент, который является Excel, либо является SMSS. Затем внешний proc начнет работать правильно. Я попытался добавить WITH RECOMPILE к вызовам процедур с любыми изменениями в поведении. Любые идеи о том, что происходит?

+2

Можете ли вы объяснить, с некоторыми примерами – TheGameiswar

+0

я второй, что сказал TheGameiswar: добавить контуры СП находится в вашем вопросе, и объяснить шаги, которые приводят к возникновению проблемы в нескольких кратких пулевых точек так последовательности события ясны. –

+0

Может ли имя схемы влиять на ваши предполагаемые и фактические результаты. schemaA.InnerSp vs schemaB.InnerSp. В целом это звучит как проблема безопасности в ситуации, когда возникают ошибки. Когда вы используете SSMS или Excel, и он работает над тем, какой пользователь используется, когда он не работает, какой пользователь используется. Выньте с повторной компиляцией, чтобы убедиться, что это скрывает реальную проблему. –

ответ

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."*/ 
+0

Спасибо, Мартин. Это точно проблема. Я позабочусь об этом. –

Смежные вопросы