症状
当对 Microsoft SQL Server 2008、SQL server 2012、SQL Server 2008 R2 或 SQL Server 2014中的表同时运行复杂更新语句时,可能会发生非聚集索引损坏。 此外,SQL Server 错误日志中可能会记录以下错误消息:
<日期><时间> spid # 错误:8646,严重性:21,状态:1。 <日期><时间> spid # 在数据库 "<DATABASENAME>" 中的表2102402659的索引 ID 3 中找不到索引条目。 指示的索引已损坏或当前更新计划存在问题。 运行 DBCC CHECKDB 或 DBCC CHECKTABLE。 如果问题仍然存在,请与产品支持人员联系。 <日期><时间> spid # 使用 "dbghelp" 版本 "4.0.5" <日期><时间> spid # * * 转储线程-Spid = 0,EC = 0x0000000BD70624C0 <时间><spid # * * * 将堆栈转储发送到 Y:\MSSQL\MSSQL10。MSSQLSERVER\MSSQL\LOG\SQLDump0003.txt><2日期><时间> spid # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * <Time日期><Date时间> SPID # * <日期><时间> spid # * 开始堆栈转储Date : <><>时间<spid # *><日期> 时间<><ErrorAbort -索引损坏><0日期><时间> spid # *
注意你可以在语句中对源表应用 NOLOCK 提示。 但是,不能在语句中将 NOLOCK 提示应用于目标表。
原因
出现此问题的原因是,当查询多次读取相同的值时, NOLOCK 提示会导致查询错误地读取表中的值。
解决方案
在 SQL Server 的以下累积更新中,此问题首先已修复。
SQL Server 2014 的累积更新1 /en-us/help/2931693
SQL Server 2012 累积更新11 /en-us/help/2908007
SQL Server 2012 SP1 的累积更新7 /en-us/help/2894115
SQL Server 2008 SP3 的累积更新13 /en-us/help/2880350
SQL Server 2008 R2 SP2 的累积更新9 /en-us/help/2887606
SQL Server 的每个新的累积更新均包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 查看 SQL Server 的最新累积更新:
状态
Microsoft 已经确认这是一个列于“适用范围”部分的 Microsoft 产品问题。