當您使用 XQuery 擷取的 XML 項目 SQL Server 2005 中的值時,您會收到 NULL 值

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

按一下這裡查看此文章的英文版本:914638
本文已封存。本文係以「現狀」提供且不會再更新。
Bug #: 20011171 (SQLBUDT)
徵狀
您會收到 NULL 值時使用 XQuery 擷取的 XML 項目的值,當下列情況成立時:
  • 為相關聯的結構描述定義中具有簡單內容的複雜型別宣告 XML 項目。
  • XML 項目宣告相關聯的結構描述定義中 混合 屬性的值為 true
  • 您可以使用 資料 函數來擷取值的 XML 項目。
發生的原因
XML 元素的值當做內嵌值至 XML 項目的 XML 項目宣告為複雜的型別具有簡單內容和混合式內容時,就會發生這個問題。因此,資料 函數不能擷取具型別的值的 XML 項目。通常,XML 項目的值被處理做為 XML 項目子系的具型別值。
解決方案

服務套件資訊

如果要解決這個問題,取得最新的 Service Pack,Microsoft SQL Server 2005。如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
913089如何取得最新的 Service Pack,SQL Server 2005 的
其他可行方案
如果要解決這個問題,請依照下列步驟執行:
  1. 您必須變更資料表資料行的已針對有問題的 XML 結構描述集合驗證其資料的項目。這個資料表資料行必須變更從具型別 XML 資料行,以不具型別的 XML 資料行。如果要執行這項操作,使用類似下列的 Transact-SQL 陳述式:
    ALTER TABLE <TableName> ALTER COLUMN <ColumnName> XMLGO
  2. 卸除現有的 XML 結構描述集合。然後,建立新的 XML 結構描述集合具有相同的定義為舊 XML 結構描述,不同之處在於 XML 項目宣告 混合 的屬性的值設為 false。如果要執行這項操作,使用類似下列的 Transact-SQL 陳述式:
    DROP XML SCHEMA COLLECTION <OldSchemaName>GOCREATE XML SCHEMA COLLECTION <NewSchemaName> AS N’<NewSchemaDefinition>’GO
  3. 將資料表資料行設回具型別驗證對抗新的 XML 結構描述集合的 XML 資料行。如果要執行這項操作,使用類似下列的 Transact-SQL 陳述式:
    ALTER TABLE <TableName> ALTER COLUMN <ColumnName> XML(<NewSchemaName>)GO
附註<TableName> 表示資料表的名稱。<ColumnName> 代表 XML 資料表資料行的名稱。<OldSchemaName> 代表舊有問題的結構描述集合的名稱。<NewSchemaName> 代表新的結構描述集合的名稱。<NewSchemaDefinition> 代表定義新的結構描述集合的程式碼。
狀況說明
Microsoft 已確認<適用於>一節所列之 Microsoft 產品確實有此問題。 這個問題,首先已經在 Microsoft SQL Server 2005 Service Pack 1 中獲得修正。
其他相關資訊
針對複雜類型,具有簡單內容,我們不建議您將複雜型別的 混合 屬性的值設定為 true。在全球資訊網協會 (W3C) 網站使用在 XML 結構描述結構上的規格也會討論這個問題。詳細資訊]、 [請參閱 「 3.4.3 」 一節] 和 ["3.4.4 」 一節中下列網站:

如果要重現問題的步驟

  1. 開啟 SQL Server 2005 管理 Studio。
  2. 連線到 SQL Server 執行個體。
  3. 展開 [資料庫],然後按一下您想要修改的資料庫。
  4. 在 [檔案] 功能表上指向 [新增],然後按一下 [資料庫引擎查詢]。會出現 [查詢編輯器] 視窗。
  5. 查詢編輯器] 視窗中貼上下列程式碼範例:
    create xml schema collection myschema as N'<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">	<xs:element name="ElementName" type="xs:integer" />			<xs:complexType name="newct" mixed="true">		<xs:simpleContent>			<xs:extension base="xs:integer">				<xs:attribute name="bar" type="xs:integer" />			</xs:extension>		</xs:simpleContent>	</xs:complexType></xs:schema>'gocreate table xml_test (pk int primary key identity(1,1), xmlcol xml(myschema))goinsert xml_test values ('<ElementName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="newct" bar="10">30</ElementName>')goinsert xml_test values ('<ElementName>30</ElementName>')goselect xmlcol.query('data(/ElementName)')from xml_test
而輸出則是與下列類似:
<empty>30
注意 在這個輸出 <empty>指出沒有任何出現。

不過,預期輸出會如下所示:
3030
参考
如需有關 資料 函數的 XQuery,請造訪下列 Microsoft 開發 o 人 h 員 û 工 u 具 ã 網路 (MSDN) 網站]:

警告:本文為自動翻譯

內容

文章識別碼:914638 - 最後檢閱時間:12/09/2015 04:40:53 - 修訂: 2.3

Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Workgroup Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition

  • kbnosurvey kbarchive kbmt kbsql2005presp1fix kbsql2005xml kbsql2005tsql kbexpertiseadvanced kbtshoot kbprb KB914638 KbMtzh
意見反應