无法查询模式绑定视图的基础表

Jef*_*ias 8 sql-server statistics materialized-view upgrade datetime

我使用备份还原技术和一组传输后操作(如DBCC UPDATEUSAGE或)将数据库从 SQL Server 2008R2 迁移到 SQL Server 2019(均为企业版)UPDATE STATISTICS XXX

在统计更新时,我收到以下错误:

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.
Run Code Online (Sandbox Code Playgroud)

我知道该消息非常明确(在 2008R2 上语法正确的视图在 2019 年不再适用)。我不明白为什么定义的视图WITH SCHEMABINDING无效会阻止更新基础表上的统计信息。

此外,在使用WHERE子句查询基础表时,我收到相同的错误消息,除非我使用以下提示强制执行 FULLSCAN:

OPTION(TABLE HINT( $mytable, FORCESCAN ))
Run Code Online (Sandbox Code Playgroud)

我知道如果 DDL 更改到基础架构绑定对象,SQL Server 会触发错误,但我不明白为什么,如果视图无效,则无法像往常一样使用基础对象。

我确定有一个解释(例如由于视图无效,无法处理模式绑定视图的保护机制),但我在文档中找不到它。

我跑了DBCC CHECKDB没有问题。我将兼容级别更改为 150。

Pau*_*ite 13

文档

查询不必在FROM子句中显式引用索引视图,以便查询优化器使用索引视图。如果查询包含对也存在于索引视图中的基表中的列的引用,并且查询优化器估计使用索引视图提供最低成本的访问机制,则查询优化器选择索引视图,类似于它的方式当查询中没有直接引用基表索引时,选择基表索引。

当您的数据库中有无效的索引视图时,当优化器考虑使用索引视图而不是基表访问时,此企业版功能可能会产生错误。

可以使用EXPAND VIEWS 查询提示禁用此自动索引视图匹配功能:

EXPAND VIEWS
指定展开索引视图。还指定查询优化器不会将任何索引视图视为任何查询部分的替代品。当视图定义替换查询文本中的视图名称时,将展开视图。

此查询提示实际上不允许在查询计划中直接使用索引视图和索引视图上的索引。

升级数据库时,发出警告:

警告:无法绑定对象“ZZZZ”并在升级过程中被忽略。考虑审查和更正其定义。

这很容易错过,在某些情况下甚至可能对用户不可见。尽管如此,教训还是很清楚的:包含无效对象的数据库可能会产生意外错误。

DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS 也会检测到问题。

如果您需要在 SQL Server 2019 上运行数据库,请使用数据库兼容性级别 100,直到您能够解决升级问题。这将允许使用加法运算符将日期时间添加到时间。