数据取值函数 - data (XQuery)

适用于:SQL Server (所有受支持的版本)

返回 由$arg指定的每个项的类型化值。

语法

  
fn:data ($arg as item()*) as xdt:untypedAtomic*  

参数

$arg
将返回其类型化值的各项的顺序。

备注

下列情况适用于类型化值:

  • 原子值的类型化值是原子值。

  • 文本节点的类型化值是文本节点的字符串值。

  • 注释的类型化值是注释的字符串值。

  • 处理指令的类型化值是处理指令的内容,不含处理指令目标名称。

  • 文档节点的类型化值是文档节点的字符串值。

下列情况适用于属性节点和元素节点:

  • 如果属性节点用 XML 架构类型类型化,则相应地,该节点的类型化值就是类型化值。

  • 如果属性节点为非类型化,则其类型化值等于作为 xdt:untypedAtomic 实例返回的字符串值。

  • 如果未键入元素节点,则其类型化值等于作为 xdt:untypedAtomic 实例返回的字符串值。

下列情况适用于类型化元素节点:

  • 如果元素具有简单的内容类型, 则 data () 返回元素的类型化值。

  • 如果节点是复杂类型,包括 xs:anyType, 则数据 () 返回静态错误。

尽管使用 data () 函数经常是可选的,如以下示例所示,但指定 数据 () 函数会显式提高查询可读性。 有关详细信息,请参阅 XQuery 基础知识

不能在构造的 XML 上指定 数据 () ,如下所示:

declare @x xml  
set @x = ''  
select @x.query('data(<SomeNode>value</SomeNode>)')  

示例

本主题针对 AdventureWorks 数据库中存储在各种 xml 类型列中的 XML 实例提供 XQuery 示例。

A. 使用 data() XQuery 函数提取节点的类型化值

以下查询说明了 数据 () 函数如何用于检索属性、元素和文本节点的值:

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 () 函数是可选的。 如果未指定 数据 () 函数,则隐式假定该函数。 下面的查询将与前面的查询生成相同的结果:

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  

以下示例演示了 需要数据 () 函数的实例。

在以下查询中, $pd/p1:Specifications/Material 返回 <Material> 元素。 此外, 数据 ($pd/p1:Specifications/Material) 返回类型为 xdt:untypedAtomic 的字符数据类型,因为 <Material> 为非类型化。 输入非类型化时, 数据的结果 () 类型化为 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  

另请参阅

针对 xml 数据类型的 XQuery 函数