致命错误 3624:iKey < m_statBlob.GetHeader()->GetKeyCount()

Dal*_*e K 4 sql-server sql-server-2012

当我运行以下查询时收到错误:

SELECT (
        SELECT 1
        FROM dbo.AccountEntry AE
        WHERE AE.Account = P.Account
        )
FROM dbo.Proposal P
WHERE P.id = @Id
Run Code Online (Sandbox Code Playgroud)

当通过 ADO.NET 运行时,它给出:

警告:致命错误 3624 发生在 2016 年 6 月 20 日凌晨 2:28。记下错误和时间,并联系您的系统管理员。当前命令发生严重错误。结果,如果有的话,应该被丢弃。

在 SSMS 中运行时,它会给出

位置:statutil.cpp:4128
表达式:iKey < m_statBlob.GetHeader()->GetKeyCount()
SPID:59 进程 ID:1732
消息 3624,级别 20,状态 1,第 1 行
系统断言检查失败。有关详细信息,请查看 SQL Server 错误日志。通常,断言失败是由软件错误或数据损坏引起的。要检查数据库损坏,请考虑运行 DBCC CHECKDB。如果您同意在安装过程中向 Microsoft 发送转储,则会向 Microsoft 发送一个小型转储。Microsoft 可能提供最新 Service Pack 中的更新或技术支持的 QFE。
Msg 0, Level 20, State 0, Line 0
当前命令发生严重错误。结果,如果有的话,应该被丢弃。

有趣的是,当将@Account 设置为 P.Account 时,此代码有效:

select 1 from dbo.AccountEntry AE where AE.Account = @Account
Run Code Online (Sandbox Code Playgroud)

我试过重新启动服务器。

我尝试删除所有索引和统计信息。

我已经运行 DBCC CHECKDB 并且它没有返回任何错误。

我们认为自周五服务器愉快地运行以来,服务器没有任何变化。

SQL 版本:Microsoft SQL Server 2012 - 11.0.5343.0 (X64) 2015 年 5 月 4 日 19:11:32 版权所有 (c) Microsoft Corporation Standard Edition(64 位)在 Windows NT 6.2(Build 9200:)(Hypervisor)上

Mar*_*ith 9

这个问题与损坏/无效的统计数据有关。

此连接项中提到了可能发生的特定情况

如果您更改聚集索引的键,禁用的非聚集索引的元数据将变为无效,这会导致您遇到的故障。

解决方法是删除禁用的索引。

如果上述情况不适用于您,则尝试找出有问题的特定表,如果您无法确定应该执行的工作(然后重新创建如果需要,统计)。

如果以上都不起作用,那么可能是时候用 Microsoft PSS 开一个案例了。

您似乎也在 SP2 + 安全公告 MS15-058。从那时起,有很多累积更新和另一个服务包。您遇到的问题可能已经在其中一个中得到解决。