substring 函数 (XQuery)

返回 $sourceString 的子串,从 $startingLoc 指定的位置开始,长度为 $length 指定的字符数。

语法

fn:substring($sourceString as xs:string?,
                          $startingLoc  as as xs:decimal?) as xs:string?

fn:substring($sourceString as xs:string?,
                          $startingLoc as xs:decimal?,
                          $length as xs:decimal?) as xs:string?

参数

  • $sourceString
    资源字符串。

  • $startingLoc
    子字符串在资源字符串中的起点。如果此值为负数或 0,则只返回那些所在位置大于零的字符。如果此值大于 $sourceString 的长度,则返回长度为零的字符串。

  • $length
    [可选] 要检索的字符数。如果没有指定此值,它将返回从 $startingLoc 中指定的位置开始直到字符串末尾的所有字符。

注释

带有三个参数的函数将返回 $sourceString 中其位置 $p 遵守以下指定的字符串:

fn:round($startingLoc) <= $p < fn:round($startingLoc) + fn:round($length)

$length 的值可以大于 $sourceString 值中指定的、位于起始位置后的字符数。在这种情况下,子字符串最多返回到达 $sourceString 末尾时的字符数。

字符串中第一个字符位于位置 1。

如果 $sourceString 值是空序列,则该值将被作为长度为零的字符串来处理。否则,如果 $startingLoc 或 $length 是空序列,将返回空序列。

示例

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

A. 使用 substring() XQuery 函数来检索部分概要产品型号说明

该查询将检索文档中说明产品型号的文本(<Summary> 元素)中的前 50 个字符。

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT ProductModelID, CatalogDescription.query('
    <Prod>{ substring(string((/pd:ProductDescription/pd:Summary)[1]), 1, 50) }</Prod>
 ') as Result
FROM Production.ProductModel
where CatalogDescription.exist('/pd:ProductDescription')  = 1;

请注意上述查询的以下方面:

  • string() 函数将返回 <Summary> 元素的字符串值。使用此函数是因为 <Summary> 元素既包含文本又包含子元素(html 格式的元素),还因为将跳过这些元素并检索所有文本。

  • substring() 函数将检索 string() 检索到的字符串值中的前 50 个字符。

下面是部分结果:

ProductModelID Result

-------------- -----------------------------------------

19 <Prod>Our top-of-the-line competition mountain bike.</Prod>

23 <Prod>Suitable for any type of riding, on or off-roa</Prod>

...

实现限制

限制如下:

  • SQL Server 要求 $startingLoc 和 $length parameters 的类型为 xs:decimal 而不是 xs:double。

  • SQL Server 允许$startingLoc 和 $length 为空序列,因为映射到 () 的动态错误的结果有可能是空序列。

  • Unicode UTF-16 代理对被算作两个字符而不是一个字符。