Compartilhar via


"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 para READ_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:

  1. 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.

  2. Adicione tratamento de erro ao código para capturar o erro 556 e, em seguida, reenviar a INSERT EXEC consulta.

  3. Desmarque o cache do procedimento quando o Repositório de Dados de Consulta retornar ao READ_WRITE estado de READ_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.