Migrei um banco de dados do SQL Server 2008R2 para o SQL Server 2019 (ambos Enterprise Edition) usando a técnica de restauração de backup e um conjunto de ações pós-transferência como DBCC UPDATEUSAGE
ou UPDATE STATISTICS XXX
.
Na atualização das estatísticas, recebo o seguinte erro:
Msg 402, Level 16, State 1, Procedure ZZZZ, Line 5 [Batch Start Line 0]
The data types datetime and time are incompatible in the add operator.
Msg 4413, Level 16, State 1, Line 1
Could not use view or function 'ZZZZ' because of binding errors.
Eu sei que a mensagem é bastante explícita (a visão, que estava sintaticamente correta em 2008R2 não está mais em 2019). Não entendo por que uma exibição definida WITH SCHEMABINDING
como inválida impediria a atualização de estatísticas em uma tabela subjacente.
Além disso, recebo a mesma mensagem de erro ao consultar a tabela subjacente com uma WHERE
cláusula, exceto se eu forçar um FULLSCAN com a seguinte dica:
OPTION(TABLE HINT( $mytable, FORCESCAN ))
Eu sei que o SQL Server irá disparar um erro em caso de alteração de DDL para objetos vinculados ao esquema subjacentes, mas não entendo por que, se a exibição for inválida, os objetos subjacentes não poderão ser usados normalmente.
Tenho certeza de que há uma explicação (como os mecanismos de proteção para exibições vinculadas ao esquema não podem ser processadas devido à invalidez da exibição), mas não consigo encontrá-la com certeza na documentação.
Eu corri um DBCC CHECKDB
sem problema. Mudei o nível de compatibilidade para 150.
Da documentação :
Quando você tem uma exibição indexada inválida em seu banco de dados, esse recurso Enterprise Edition pode produzir erros quando o otimizador considera o uso da exibição indexada em vez do acesso à tabela base.
Esse recurso de correspondência automática de exibição indexada pode ser desabilitado com a
EXPAND VIEWS
dica de consulta :Quando você atualizou seu banco de dados, um aviso foi emitido:
Isso é fácil de perder e pode até não ser visível para o usuário em alguns cenários. Ainda assim, a lição é clara: um banco de dados com objetos inválidos pode produzir erros inesperados.
DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS
também detectará o problema.Se você precisar executar o banco de dados no SQL Server 2019, use o nível de compatibilidade do banco de dados 100 até conseguir resolver os problemas de atualização. Isso permitirá que as datas sejam adicionadas às horas usando o operador de adição.
Com relação a quando você consulta a tabela subjacente, talvez o otimizador produza um plano que use o índice de exibição em vez da tabela?
O plano de execução deve informar ou tente a dica EXPAND VIEWS.