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

Aplica-se a
SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2017 Developer on Windows SQL Server 2017 Enterprise on Windows SQL Server 2017 Enterprise Core on Windows SQL Server 2017 Standard on Windows SQL Server 2016 Service Pack 1 SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use)

Sintomas

Um erro de asserção pode ocorrer quando o Microsoft SQL Server executa repetidamente um procedimento armazenado que executa o seguinte:

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

Você pode encontrar o erro de asserção semelhante ao seguinte no log de erros do SQL Server:

SPID de Data/Hora Erro: 17065, Gravidade: 16, Estado: 1.

SPID Data/Hora Asserção do SQL Server: Arquivo: FilePath\FileName, line = LineNumber Falha na declaração = 'fFalse' Tentativa de acessar o identificador de blob expirado (1). Esse erro pode estar relacionado ao tempo. Se o erro persistir após a execução da instrução, use DBCC CHECKDB para marcar a integridade estrutural do banco de dados ou reinicie o servidor para garantir que as estruturas de dados na memória não sejam corrompidas.

SPID de Data/Hora Erro: 3624, Gravidade: 20, Estado: 1.

SPID de Data/Hora Uma verificação de marca de asserção do sistema falhou. Verifique o log de erros do SQL Server para obter detalhes. Normalmente, uma falha de declaração é causada por um bug de software ou corrupção de dados. Para marcar se há banco de dados corrompido, considere executar DBCC CHECKDB. Se você concordou em enviar despejos para a Microsoft durante a instalação, um minidespejo será enviado para a Microsoft. Uma atualização pode estar disponível da Microsoft no Service Pack mais recente ou em um hotfix do Suporte Técnico.

Causa

O SQL Server tem lógica interna para desabilitar o cache de consultas que fazem referência a objetos grandes para que as execuções subsequentes não façam referência a esses LOBs (que foram criados durante execuções anteriores e, portanto, são inválidos para execuções subsequentes). Essa lógica não lidou com o caso de DNR (Resolução de Nome Adiado ) em tabelas temporárias que causaram esses planos A criação de tabelas temporárias com escopo é cara, e o SQL Server as armazena em cache para reutilização em execuções subsequentes. Isso impede a recompilação dessas consultas devido a alterações de esquema.

Saiba mais sobre a Resolução de Nome Adiado.

Resolução

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

Atualização cumulativa 8 para o SQL Server 2016 SP1

Atualização cumulativa 4 para o SQL Server 2017

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

Sobre atualizações cumulativas para o SQL Server

Cada nova atualização cumulativa do SQL Server contém todos os hotfixes e correções de segurança que estavam no build anterior. Confira a atualização cumulativa mais recente do SQL Server:

Atualização cumulativa mais recente do SQL Server 2016

Atualização cumulativa mais recente do SQL Server 2017

atualizações cumulativas mais recentes do SQL Server 2014

Status

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a".

Referências

Saiba mais sobre a terminologia que a Microsoft usa para descrever atualizações de software.