Compartilhar via


Erro "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 Armazenamento de Dados de Consulta falha periodicamente.

Versão original do produto: SQL Server 2016
Número original do KB: 4465511

Sintomas

Considere o cenário a seguir.

  • Você tem um banco de dados do Microsoft SQL Server 2016 que está usando o recurso Armazenamento de Dados de Consulta.

  • Você tem um procedimento armazenado que faz uma chamada para outro procedimento armazenado usando a INSERT...EXEC sintaxe.

  • O recurso Armazenamento de Dados de Consulta executa periodicamente a limpeza automática à medida que aumenta para seu tamanho máximo configurado. Além disso, o estado do Armazenamento 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 semelhante à seguinte:

Msg 556, Nível 16, Estado 2, Linha LineNumber
Falha em INSERT EXEC porque o procedimento armazenado alterou o esquema da tabela de destino.

Causa

O processo de limpeza automática libera o plano do Query Data Store. A consulta encontra uma operação de recompilação porque o plano está ausente no Armazenamento de Dados de Consulta. No entanto, o plano ainda está presente no cache de procedimentos. Por design, quando a operação de recompilação ocorre, o SQL Server gera o erro 556 para impedir a execução duplicada do procedimento filho. Essa operação duplicada faria com que resultados incorretos fossem retornados.

Resolução

Informações do Service Pack para SQL Server 2016

Esse problema foi corrigido no seguinte service pack para SQL Server:

Service Pack 3 para SQL Server 2016

Sobre service packs para SQL Server:

Os service packs são cumulativos. Cada novo service pack contém todas as correções que estão nos service packs anteriores, juntamente com quaisquer novas correções. Recomendamos que você aplique o service pack mais recente e a atualização cumulativa mais recente para esse service pack. Não é necessário instalar um service pack anterior antes de instalar o service pack mais recente. Consulte a Tabela 1 no artigo a seguir para obter mais informações sobre o service pack mais recente e a atualização cumulativa mais recente:

Como determinar a versão, edição e nível de atualização do SQL Server e seus componentes

Solução alternativa

Para encontrar uma solução alternativa para esse problema, siga essas etapas:

  1. Aumente o tamanho do Armazenamento de Dados de Consulta. Isso reduzirá a frequência ou a probabilidade de o Repositório de Dados de Consulta limpar o plano e entrar no READ_ONLY modo de operação.

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

  3. Limpe o cache de procedimento quando o Armazenamento de dados de consulta retornar ao READ_WRITE estado de READ_ONLY.

Informações adicionais

Devido às alterações feitas no Armazenamento de Dados de Consulta no Microsoft SQL Server 2017, esse problema não ocorre no SQL Server 2017.