適用於: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;