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