string 函数 (XQuery)

返回表示为字符串的 $arg 的值。

语法

fn:string() as xs:string
fn:string($arg as item()?) as xs:string

参数

  • $arg
    是一个节点或一个原子值。

注释

  • 如果 $arg 为空序列,则返回长度为零的字符串。

  • 如果 $arg 是一个节点,则该函数返回使用 string-value 取值函数获得的该节点的字符串值。W3C XQuery 1.0 和 XPath 2.0 数据模型规范中对此进行了定义。

  • 如果 $arg 是一个原子值,除非另行说明,该函数将返回转换为 xs:string 的表达式 $arg 所返回的字符串。

  • 如果 $arg 的类型为 xs:anyURI,则 URI 将转换为不用转义特殊字符的字符串。

  • 在此实现过程中,不带参数的 fn:string() 只能用在依赖于上下文的谓词的上下文中。特别要指出的是,它只能在方括号 ([ ]) 内使用。

示例

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

A. 使用 string 函数

下面的查询检索 <ProductDescription> 元素的 <Features> 子元素节点。

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
 /PD:ProductDescription/PD:Features
')
FROM Production.ProductModel
WHERE ProductModelID=19

下面是部分结果:

<PD:Features xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">

These are the product highlights.

<p1:Warranty xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">

<p1:WarrantyPeriod>3 years</p1:WarrantyPeriod>

<p1:Description>parts and labor</p1:Description>

</p1:Warranty>

...

</PD:Features>

如果指定了 string() 函数,将收到指定节点的字符串值。

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
 string(/PD:ProductDescription[1]/PD:Features[1])
')
FROM Production.ProductModel
WHERE ProductModelID=19;

下面是部分结果。

These are the product highlights.

3 years parts and labor...

B. 对各种节点使用 string 函数

在下面的示例中,一个 XML 实例被分配给一个 xml 类型变量。指定查询来说明对各种节点应用 string() 的结果。

declare @x xml;
set @x = '<?xml version="1.0" encoding="UTF-8" ?>
<!--  This is a comment -->
<root>
  <a>10</a>
just text
  <b attr="x">20</b>
</root>
';

下面的查询检索文档节点的字符串值。此值是通过串联所有后代文本节点的字符串值形成的。

select @x.query('string(/)');

结果如下:

This is a comment 10

just text

20

下面的查询尝试检索处理指令节点的字符串值。结果是一个空序列,因为它不包含文本节点。

select @x.query('string(/processing-instruction()[1])');

下面的查询检索注释节点的字符串值并返回文本节点。

select @x.query('string(/comment()[1])');

结果如下:

This is a comment