症状
在运行 Microsoft SQL Server 2012、2014或2016的服务器上,将数据库表中的列的数据类型从 ntext 更改为 nvarchar (max) 。 通过添加超过4000条记录更新表格时,DBCC CHECKDB 可能会报告类似于以下内容的错误:
消息8961,级别16,状态1, LineNumber 表错误: ObjectID、 indexID、 PARTITIONID、 allocUnitID (type LOB 数据)。 位于页面(PageID)、槽0、 textID 的离行数据节点与它在页面(PageID)、槽0中的引用不匹配。 消息8961,级别16,状态1, LineNumber 表错误: ObjectID、 indexID、 PARTITIONID、 allocUnitID (type LOB 数据)。 位于页面(PageID)、槽0、 textID 的离行数据节点与它在页面(PageID)、槽0中的引用不匹配。 Msg 8929、Level 16、State 1、 LineNumberObjectID、 indexID、 partitionID、 allocUnitID (键入行内数据):在非行数据中发现错误,这些 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 的每个新的累积更新包含以前的累积更新中包含的所有修补程序和安全修补程序。查看 SQL Server 的最新累积更新:
解决方法
若要在更改数据类型后解决此问题,请将 较大值类型 设置为 "行外" 选项 " 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 用于描述软件更新的 术语 。