Estamos recebendo erros estranhos em um de nossos procedimentos armazenados. Este procedimento armazenado chama outros procedimentos armazenados e estamos recebendo erros relacionados a colunas que não podem ser encontradas nos subprocedimentos. Por exemplo:
Exec StoredProc1, this stored proc calls StoredProc2, StoredProc3 & StoredProc4
Quando executo StoredProc1 pela primeira vez, recebo erros relacionados a colunas em StoredProc2. Em seguida, executo StoredProc2 diretamente e funciona, depois chamo StoredProc1 novamente e ele reclama sobre erros de coluna em StoredProc3 e assim por diante.
Eu estou supondo que isso tem a ver com a forma como o SQL Server armazenou em cache seus planos de execução para StoredProc1, e a execução de cada procedimento armazenado por sua vez força os Planos/Dependências Armazenados a serem atualizados.
Como posso corrigir isso em toda a linha?
Se eu executar cada procedimento dependente, um de cada vez, execute o pai, ele funcionará. Se eu executar estes comandos:
CHECKPOINT;
DBCC DROPCLEANBUFFERS;
DBCC FREEPROCCACHE;
e execute o procedimento pai, recebo os erros novamente.
Todos os procedimentos armazenados usam uma tabela temporária com o mesmo nome, mas se bem entendi, porque estão em procedimentos diferentes, eles criariam tabelas separadas.
Obrigado SQL Kiwi, você respondeu à minha pergunta. As tabelas temporárias são todas tabelas #temp. Depois de ler seus comentários, pensei por que não tentar renomear todas as tabelas temporárias e criar um nome exclusivo para cada uma.
Eu pensei em cada procedimento e dei a cada tabela #temp um nome exclusivo por procedimento armazenado, então executei o comando
Em seguida, tentei executar meu procedimento principal novamente e tudo parece estar funcionando novamente. O SQL deve estar se confundindo com os nomes das tabelas temporárias sendo os mesmos em todos os procedimentos armazenados. O que não consigo explicar é por que do servidor SSRS o relatório é executado e do SSMS recebo erros (somente em nosso ambiente ao vivo)
Infelizmente, peguei esse sistema de uma empresa de desenvolvimento terceirizada e não teria feito as coisas do jeito que eles fizeram. Tenho substituído lentamente algumas das tabelas temporárias por CTEs e refatorado algumas das junções desnecessárias, na maioria dos casos, isso nos dá melhor desempenho.