数据访问器函数 - 数据(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 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;