data 函数 (XQuery)

返回 $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>)');

示例

本主题提供了一些对 XML 实例的 XQuery 示例,这些实例存储在 AdventureWorks2008R2 数据库内不同的 xml 类型列中。有关这些列的概述,请参阅 AdventureWorks2008R2 数据库中的 xml 数据类型表示形式

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;