数据取值函数 - data (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
> 元素。 此外, 数据 ($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>
在以下查询中, 数据 ($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