Share via


data 函數 (XQuery)

傳回 $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 xml
set @x = ''
select @x.query('data(<SomeNode>value</SomeNode>)')

範例

本主題針對儲存在 AdventureWorks 資料庫中之各種 xml 類型資料行的 XML 執行個體,提供 XQuery 範例。如需這些資料行中每個資料行的概觀,請參閱<在 AdventureWorks 資料庫中的 xml 資料類型表示法>。

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>Almuminum Alloy</Material>Almuminum 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