CORREÇÃO: Erro de asserção ao executar um procedimento armazenado que faz referência a um objeto grande no SQL Server de 2014, 2016 e 2017

Aplica-se a: SQL Server 2014 EnterpriseSQL Server 2014 Enterprise CoreSQL Server 2014 Developer Mais

Sintomas


Um erro de declaração pode ocorrer quando o Microsoft SQL Server executa repetidamente um procedimento armazenado que executa as seguintes funções:

  • Leva um objeto grande, como varchar (max) ou varbinary (max), como um argumento, e
  • Cria uma tabela temporária que tem como escopo para a execução do procedimento, e
  • Usa o argumento de objeto grande na tabela temporária.

Você verá a afirmação de erro semelhante a seguir no log de erros do SQL Server:

Data/hora SPID Erro: 17065, gravidade: 16, estado: 1.

Data/hora SPID Declaração do SQL Server: Arquivo: FilePath\nome do arquivo, linha = LineNumber Falha na asserção = 'fFalse' na tentativa de acessar um identificador de blob expirados (1). Este erro pode estar relacionado ao tempo. Se o erro persistir após executar a instrução novamente, use DBCC CHECKDB para verificar se o banco de dados para assegurar a integridade estrutural ou reinicie o servidor para garantir que as estruturas de dados na memória não estão corrompidas.

Data/hora SPID Erro: 3624, gravidade: 20, estado: 1.

Data/hora Falha na verificação de declaração de sistema um SPID . Verifique o log de erros do SQL Server para obter detalhes. Normalmente, um erro de declaração é causado por uma software bug ou corrupção de dados. Para verificar se há corrupção de banco de dados, considere executar DBCC CHECKDB. Se você concordou em Enviar despejos para a Microsoft durante a instalação, um minidespejo será enviado à Microsoft. Uma atualização pode ser disponibilizada pela Microsoft no Service Pack mais recente ou um hotfix do suporte técnico.

Causa


SQL Server possui uma lógica interna para desativar o cache de consultas que fazem referência a objetos grandes para que as execuções subsequentes não fazem referência a esses LOBs (que foram criadas durante execuções anteriores e, portanto, são inválidos para execuções subsequentes). Lógica não identificou o caso de Resolução de nome adiada (DNR) em tabelas temporárias que causou os planos ser armazenada em cache. Tabelas temporárias com escopo são caras de criar e SQL Server armazena em cache-los para reutilização em execuções subsequentes. Isso evita a recompilação de tais consultas devido a alterações de esquema.

Saiba mais sobre a Resolução de nome adiada.

Resolução


Esse problema foi corrigido nas seguintes atualizações cumulativas para o SQL Server:

Atualização de cumulativo 8 para SQL Server 2016 SP1

Atualização cumulativa 4 para o SQL Server 2017

10 de atualização cumulativa para SQL Server 2014 Service Pack 2

Status


A Microsoft confirma que este é um problema em seus produtos listados na seção "Aplica-se a".

Referências


Conheça a terminologia que a Microsoft usa para descrever as atualizações de software.