徵狀
您可以在執行 Microsoft SQL Server 2012、2014或2016的伺服器上,將資料庫資料表中資料行的資料類型從 Ntext 變更為 Nvarchar (max) 。 當您新增超過4000條記錄來更新資料表時,DBCC CHECKDB 可能會報告如下所示的錯誤:
Msg 8961、Level 16、State 1、 LineNumber 資料表錯誤: ObjectID、 indexID、 PARTITIONID、 allocUnitID (類型 LOB 資料)。 在頁面(PageID)、槽0、 textID 與(PageID)、槽0中的 [離列資料] 節點不符合其參照。 Msg 8961、Level 16、State 1、 LineNumber 資料表錯誤: ObjectID、 indexID、 PARTITIONID、 allocUnitID (類型 LOB 資料)。 在頁面(PageID)、槽0、 textID 與(PageID)、槽0中的 [離列資料] 節點不符合其參照。 Msg 8929、Level 16、State 1、 LineNumberObjectID、 indexID、 partitionID、 allocUnitID (輸入列內資料):在非資料列資料中發現錯誤,且由 RID 所辨識的資料記錄所擁有的 識別碼 = (RID) "TableName" 的 DBCC 結果。 物件 "TableName" 的1頁中有1列。 CHECKTABLE 發現資料表 "TableName" (ObjectID)中出現0個分配錯誤和3個一致性錯誤。 repair_allow_data_loss 是 DBCC CHECKTABLE (DatabaseName. TableName)找到之錯誤的最低修復層級。 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 用於描述軟體更新的 術語 。