資料存取子函式 - 資料 (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 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>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  

另請參閱

針對 xml 資料類型的 XQuery 函式