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

文章翻譯 文章翻譯
文章編號: 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> XML
    GO
    
  2. 卸除現有的 XML 結構描述集合。然後,建立新的 XML 結構描述集合具有相同的定義為舊 XML 結構描述,不同之處在於 XML 項目宣告 混合 的屬性的值設為 false。如果要執行這項操作,使用類似下列的 Transact-SQL 陳述式:
    DROP XML SCHEMA COLLECTION <OldSchemaName>
    GO
    
    CREATE 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 」 一節中下列網站:
http://www.w3.org/TR/xmlschema-1/#Complex_Type_Definitions

如果要重現問題的步驟

  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>'
    go
    
    create table xml_test (pk int primary key identity(1,1), xmlcol xml(myschema))
    go
    
    insert xml_test values ('
    <ElementName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="newct" bar="10">30</ElementName>')
    go
    
    insert xml_test values ('
    <ElementName>30</ElementName>')
    go
    
    select xmlcol.query('data(/ElementName)')
    from xml_test
    
而輸出則是與下列類似:
<empty>
30
注意 在這個輸出 <empty>指出沒有任何出現。

不過,預期輸出會如下所示:
30
30

?考

如需有關 資料 函數的 XQuery,請造訪下列 Microsoft 開發 o 人 h 員 ? 工 u 具 ? 網路 (MSDN) 網站]:
http://msdn2.microsoft.com/en-us/library/ms187038.aspx

屬性

文章編號: 914638 - 上次校閱: 2006年4月6日 - 版次: 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
關鍵字:?
kbmt kbsql2005presp1fix kbsql2005xml kbsql2005tsql kbexpertiseadvanced kbtshoot kbprb KB914638 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:914638
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com