"INSERT EXEC falha porque o procedimento armazenado alterou o esquema da tabela de destino" no SQL Server 2016
Este artigo ajuda você a contornar um problema que ocorre porque um procedimento armazenado em um banco de dados que está usando o recurso Repositório de Dados de Consulta falha periodicamente.
Versão original do produto: SQL Server 2016
Número de KB original: 4465511
Sintomas
Considere o seguinte cenário:
Você tem um banco de dados do Microsoft SQL Server 2016 que está usando o recurso Repositório de Dados de Consulta.
Você tem um procedimento armazenado que faz uma chamada para outro procedimento armazenado usando a
INSERT...EXEC
sintaxe.O recurso Repositório de Dados de Consulta executa periodicamente a limpeza automática à medida que aumenta para o tamanho máximo configurado. Além disso, o estado do Repositório de Dados de Consulta muda de
READ_WRITE
paraREAD_ONLY
.
Nesse cenário, a execução do procedimento armazenado pai falha periodicamente e você recebe uma mensagem de erro que se assemelha ao seguinte:
Msg 556, Nível 16, Estado 2, LineNumber
O INSERT EXEC falhou porque o procedimento armazenado alterou o esquema da tabela de destino.
Motivo
O processo de limpeza automática libera o plano do Repositório de Dados de Consulta. A consulta encontra uma operação de recompilamento porque o plano está ausente do Repositório de Dados de Consulta. No entanto, o plano ainda está presente no cache do procedimento. Por design, quando a operação de recompile ocorre, SQL Server lança o erro 556 para impedir a execução duplicada do procedimento filho. Tal operação duplicada faria com que os resultados incorretos fossem retornados.
Resolução
Informações do Service Pack para SQL Server 2016
Esse problema é corrigido no seguinte service pack para SQL Server:
Service Pack 3 para SQL Server 2016
Sobre os service packs para SQL Server:
Os pacotes de serviço são cumulativos. Cada novo service pack contém todas as correções que estão em pacotes de serviço anteriores, juntamente com quaisquer novas correções. Recomendamos que você aplique o pacote de serviços mais recente e a atualização cumulativa mais recente para esse service pack. Você não precisa instalar um service pack anterior antes de instalar o pacote de serviços mais recente. Consulte a Tabela 1 no artigo a seguir para obter mais informações sobre o pacote de serviços mais recente e a atualização cumulativa mais recente:
Como determinar o nível de versão, edição e atualização de SQL Server e seus componentes
Solução alternativa
Como solução alternativa a esse problema, execute as seguintes etapas:
Aumente o tamanho do Repositório de Dados de Consulta. Isso reduzirá a frequência ou a probabilidade do Repositório de Dados de Consulta limpar o plano e entrar no
READ_ONLY
modo operacional.Adicione tratamento de erro ao código para capturar o erro 556 e, em seguida, reenviar a
INSERT EXEC
consulta.Desmarque o cache do procedimento quando o Repositório de Dados de Consulta retornar ao
READ_WRITE
estado deREAD_ONLY
.
Informações adicionais
Devido às alterações feitas no Repositório de Dados de Consulta no Microsoft SQL Server 2017, esse problema não ocorre no SQL Server 2017. Esse problema não será corrigido no SQL Server 2016.
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de