共用方式為


資料存取子函式 - 資料 (XQuery)

適用於:SQL Server

傳回$arg指定之每個專案的具型別值。

語法

fn:data ($arg as item()*) as xdt:untypedAtomic*

引數

$arg

傳回類型化值的專案順序。

備註

下列考量適用於類型化值:

  • 不可部分完成值的具型別值是不可部分完成的值。

  • 文字節點的具型別值是文字節點的字串值。

  • 批註的具型別值是批注的字串值。

  • 處理指令的具型別值是處理指令的內容,不含處理指令目標名稱。

  • 文件節點的具型別值是其字串值。

下列考量適用於屬性和元素節點:

  • 如果屬性節點是以 XML 架構類型輸入,則其具型別值會據以型別值。

  • 如果屬性節點未類型化,則其類型化值等於其作為 實 xdt:untypedAtomic例傳回的字串值。

  • 如果尚未鍵入元素節點,則其類型值等於其作為 的 xdt:untypedAtomic實例傳回的字串值。

下列考量適用於類型化元素節點:

  • 如果元素具有簡單的內容類型, data() 則傳回元素的類型化值。

  • 如果節點是複雜類型,包括 xs:anyType, data() 則會傳回靜態錯誤。

雖然使用函 data() 式通常是選擇性的,如下列範例所示,但明確指定函 data() 式會增加查詢可讀性。 如需詳細資訊,請參閱 XQuery 基本概念

您無法在建構的 XML 上指定 data() ,如下列範例所示:

DECLARE @x AS XML;

SET @x = '';

SELECT @x.query('data(<SomeNode>value</SomeNode>)');

範例

本文針對儲存在 AdventureWorks 資料庫中各種 xml 類型資料行中的 XML 執行個體提供 XQuery 範例。

A. 使用 data() XQuery 函數來擷取節點的類型化值

下列查詢說明如何使用函 data() 式來擷取屬性、元素和文字節點的值:

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1, 'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query(N'
 for $pd in //p1:ProductDescription
 return
    <Root
      ProductID = "{ data( ($pd//@ProductModelID)[1] ) }"
      Feature =   "{ data( ($pd/p1:Features/wm:Warranty/wm:Description)[1] ) }" >
    </Root>
 ') AS Result
FROM Production.ProductModel
WHERE ProductModelID = 19;

結果如下︰

<Root ProductID="19" Feature="parts and labor"/>

如前所述,當您建構屬性時,此 data() 函式是選擇性的。 如果您未指定函 data() 式,則會隱含假設函式。 下列查詢會產生與上一個查詢相同的結果:

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1, 'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
      for $pd in //p1:ProductDescription
         return
          <Root
                ProductID = "{ ($pd/@ProductModelID)[1] }"
                Feature =   "{ ($pd/p1:Features/wm:Warranty/wm:Description)[1] }" >
           </Root>
 ') AS Result
FROM Production.ProductModel
WHERE ProductModelID = 19;

下列範例說明需要函 data() 式的實例。

在下列查詢中, $pd/p1:Specifications/Material 傳回 <Material> 元素。 此外, data($pd/p1:Specifications/ Material) 傳回類型為 xdt:untypedAtomic的字元資料,因為 <Material> 是未類型化的。 當輸入未鍵入時,結果 data() 會鍵入為 xdt:untypedAtomic

SELECT CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
      for $pd in //p1:ProductDescription
         return
          <Root>
             { $pd/p1:Specifications/Material }
             { data($pd/p1:Specifications/Material) }
           </Root>
 ') AS Result
FROM Production.ProductModel
WHERE ProductModelID = 19;

結果如下︰

<Root>
  <Material>Aluminum Alloy</Material>Aluminum Alloy
</Root>

在下列查詢中, data($pd/p1:Features/wm:Warranty) 會傳回靜態錯誤,因為 <Warranty> 是複雜類型元素。

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1, 'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
 <Root>
   {     /p1:ProductDescription/p1:Features/wm:Warranty }
   { data(/p1:ProductDescription/p1:Features/wm:Warranty) }
 </Root>
 ') AS Result
FROM Production.ProductModel
WHERE ProductModelID = 23;