FIX: A"DBCC CHECKDB"陳述式或"DBCC CHECKTABLE"陳述式報告錯誤後重新建立 XML 索引,SQL Server 2005 中

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:974985
Microsoft 為一個可下載檔案散佈 Microsoft SQL Server 2005 的修正程式。因為修正程式是累積,每個新版本包含所有 Hotfix 及先前的 SQL Server 2005 隨附所有安全性修正程式都修正發行。
徵狀
考慮下列案例:
  • 在 Microsoft SQL Server 2005 中,您可以包含 XML 資料型別的資料行的資料表。
  • 在資料行上建立 XML 索引。
  • 在 XML 索引上執行以 重建 子句的 ALTER INDEX 陳述式。
  • 您在資料表上執行 DBCC CHECKDB 陳述式或 DBCC CHECKTABLE 陳述式。
在這種情況下會回報遺棄的資料損毀,並且您會收到下列錯誤訊息:
msg 8964,層級 16,狀態 1,行 1
資料表錯誤: 物件識別碼 965578478、 索引識別碼為 1,分割識別碼 72057594042515456 配置單位識別碼 72057594052083712 (型別 LOB 資料)。在頁面 (1:569)、 插槽 0、 文字識別碼 1881079808 關閉資料列的資料節點不被參考。

1 物件 sys.xml_index_nodes_ <xxxxxx>」 的頁面中有 3 個資料列。
解決方案
這個問題的修正程式先於累計更新 6 的 SQL Server 2005 Service Pack 3 發行。如更多有關此累積更新套件,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
974648SQL Server 2005 Service Pack 3 的累積更新套件 6
附註因為組建是累計,每個新的修正程式版本包含所有 Hotfix 及先前的 SQL Server 2005 隨附所有安全性修正程式都修正發行。Microsoft 建議您考慮安裝最新的修正程式發行版本包含此 Hotfix。如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
960598SQL Server 2005 會建置發行 SQL Server 2005 Service Pack 3 之後所發行
Microsoft SQL Server 2005 的 Hotfix 會建立特定的 SQL Server Service Pack。您必須將 SQL Server 2005 Service Pack 3 Hotfix 套用到 SQL Server 2005 Service Pack 3 的安裝。預設狀況下,在 SQL Server Service Pack 中提供任何 Hotfix 包含在下一個 SQL Server Service Pack。
其他可行方案
如果要解決這個問題而定,使用 [下列的其中一個方法]:

方法 1

卸除並重新建立 XML 索引,而非執行 ALTER INDEX 陳述式:

--------START OF THE SCRIPT------------------------Drop table named temp if it exists----------------IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[temp]') AND type in (N'U'))DROP TABLE [dbo].[temp]------------Create a tenp table to keep the information about existing XML indexes------------Create table Temp (object_id int, index_id int, object_name varchar(256), IndexName nvarchar(256),Name nvarchar(256),Secondary_type_desc nvarchar (240),Secondary_type char(1),Using_Xml_index_id int)------------Insert XML index information into temp table----------------Insert Into TempSELECT i.object_id,i.index_id,object_name(i.object_id)as object_name, i.name as IndexName,c.name,i.Secondary_type_desc,i.Secondary_type,i.using_xml_index_id FROM sys.xml_indexes AS iINNER JOIN sys.index_columns AS ic ON i.object_id = ic.object_id AND i.index_id = ic.index_idINNER JOIN sys.columns AS c ON ic.object_id = c.object_id AND c.column_id = ic.column_idOrder by i.index_id-------------Adding a new column for Manipulation------------Alter table temp add IndName varchar(256) NULL;-------------Updating value in column for Manipulation------------Update Temp Set Secondary_type_desc = 'APRIMARY' Where Secondary_type_desc IS NULL-------------Updating value in column for Manupilation------------Update a set a.IndName = b.IndexName from temp a inner join temp b on a.using_xml_index_id = b.index_id and a.object_id = b.object_id-------------Set Ansi_padding ON to create XML indexes------------Set Ansi_Padding ON--------Cursor to Drop existing XML Indexes------------DECLARE XMLIndexDrop CURSOR READ_ONLYFOR select 'Drop Index '+ IndexName +' on '+Object_name from temp where Secondary_type is nullDECLARE @DropString varchar(400)OPEN XMLIndexDropFETCH NEXT FROM XMLIndexDrop INTO @DropStringWHILE (@@fetch_status <> -1)BEGINIF (@@fetch_status <> -2)BEGINexec(@DropString)PRINT @DropStringENDFETCH NEXT FROM XMLIndexDrop INTO @DropStringENDCLOSE XMLIndexDropDEALLOCATE XMLIndexDropGO--------Cursor to Create XML Indexes-------------DECLARE XMLIndexCreate CURSOR READ_ONLY FOR Select 'CREATE ' + Case when Secondary_type_desc = 'APRIMARY' then 'PRIMARY XML'Else 'XML' END + ' INDEX ' + IndexName +' on ' + object_name + ' ('+name+')'+ Case when Secondary_type_desc = 'APRIMARY' then ''Else ' USING XML INDEX ' + IndName + ' FOR ' + Secondary_type_desc END From Temp Order By Secondary_type_desc AscDECLARE @CreateString varchar(400)OPEN XMLIndexCreateFETCH NEXT FROM XMLIndexCreate INTO @CreateString WHILE (@@fetch_status <> -1)BEGINIF (@@fetch_status <> -2)BEGINexec(@CreateString )PRINT @CreateString ENDFETCH NEXT FROM XMLIndexCreate INTO @CreateString ENDCLOSE XMLIndexCreateDEALLOCATE XMLIndexCreateGO--------Closing the cursor----------------------END OF THE SCRIPT-------------- 


方法 2

卸除所有的 XML 索引,然後再執行在資料表中索引上的 [ALTER INDEX 陳述式。然後,重新建立 XML 索引。
狀況說明
Microsoft 已確認<適用於>一節所列之 Microsoft 產品確實有此問題。
参考
更多有關的 SQL Server 累加式維修模型會按一下下列文章編號,檢視發行項 「 Microsoft 知識庫 」 中:
935897累加式的維修模型是可以從 SQL Server 小組來傳遞回報問題的 Hotfix
為更多有關如何取得 SQL Server 2005 Service Pack 3,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
913089如何取得最新的 Service Pack,SQL Server 2005 的
如需有關 SQL Server 2005 Service Pack 3 (SP3) 中的新功能,以及關於 SQL Server 2005 SP3 的改進的詳細資訊,請造訪下列 Microsoft 網站]: 更多有關的 SQL Server 更新命名的結構描述會按一下下列文章編號,檢視發行項 「 Microsoft 知識庫 」 中:
822499Microsoft SQL Server 軟體更新套件的新命名結構描述
如需有關軟體更新術語的詳細資訊,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
824684用來描述 Microsoft 軟體更新標準術語的說明

警告:本文為自動翻譯

內容

文章識別碼:974985 - 最後檢閱時間:04/26/2010 17:52:43 - 修訂: 2.0

Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Workgroup Edition, Microsoft SQL Server 2005 Standard X64 Edition, Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems, Microsoft SQL Server 2005 Enterprise X64 Edition, Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems

  • kbmt kbsurveynew kbexpertiseadvanced kbqfe kbfix KB974985 KbMtzh
意見反應