应用对象
SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Enterprise Core SQL Server 2012 Standard SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) 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) SQL Server 2016 Service Pack 1

症状

在运行 Microsoft SQL Server 2012、2014或2016的服务器上,将数据库表中的列的数据类型从 ntext 更改为 nvarchar (max) 。 通过添加超过4000条记录更新表格时,DBCC CHECKDB 可能会报告类似于以下内容的错误:

消息8961,级别16,状态1, LineNumber 表错误: ObjectIDindexIDPARTITIONIDallocUnitID (type LOB 数据)。 位于页面(PageID)、槽0、 textID 的离行数据节点与它在页面(PageID)、槽0中的引用不匹配。 消息8961,级别16,状态1, LineNumber 表错误: ObjectIDindexIDPARTITIONIDallocUnitID (type LOB 数据)。 位于页面(PageID)、槽0、 textID 的离行数据节点与它在页面(PageID)、槽0中的引用不匹配。 Msg 8929、Level 16、State 1、 LineNumberObjectIDindexIDpartitionIDallocUnitID (键入行内数据):在非行数据中发现错误,这些 ID 由 RID (rid)标识的数据记录所拥有 "TableName" 的 DBCC 结果。 对象 "TableName" 的1页中有1行。 CHECKTABLE 在表 "TableName" (ObjectID)中发现0个分配错误和3个一致性错误。 repair_allow_data_loss 是 DBCC CHECKTABLE (DatabaseName)发现的错误的最低修复级别。 DBCC 执行完毕。 如果 DBCC 打印了错误消息,请与您的系统管理员联系。

解决方案

在 SQL Server 的以下累积更新中修复了此问题:

SQL Server 2016 RTM 的累积更新5

SQL Server 2016 SP1 的累积更新2

SQL Server 2014 SP2 的累积更新4

SQL Server 2014 SP1 的累积更新11

SQL Server 2012 的累积更新 7 Service Pack 3

SQL Server 的每个新的累积更新包含以前的累积更新中包含的所有修补程序和安全修补程序。查看 SQL Server 的最新累积更新:

SQL Server 2016 的最新累计更新

SQL Server 2014 的最新累积更新

SQL Server 2012 SP3 的最新累积更新

解决方法

若要在更改数据类型后解决此问题,请将 较大值类型 设置为 "行外" 选项 " 1"。

ALTER TABLE TableName ALTER COLUMN COLUMN_NAME nvarchar(max) NOT NULL 
go
exec sp_tableoption 'TableName', 'large value types out of row', '1'

状态

Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。

参考

了解 Microsoft 用于描述软件更新的 术语

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。