concat 函数 (XQuery)

接受零或更多个字符串作为参数,并返回通过连接其中每个参数的值而创建的字符串。

语法

fn:concat ($string as xs:string?
           ,$string as xs:string?
           [, ...]) as xs:string

参数

  • $string
    可选择进行连接的字符串。

注释

此函数必须至少包含两个参数。如果一个参数为空序列,则将被作为零长度字符串处理。

示例

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

A. 使用 concat() XQuery 函数连接字符串

对于特定产品型号,此查询将返回通过连接保修期和保修说明而创建的字符串。在目录说明文档中,<Warranty> 元素由 <WarrantyPeriod> 和 <Description> 子元素组成。

WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
    <Product 
        ProductModelID= "{ (/pd:ProductDescription/@ProductModelID)[1] }"
        ProductModelName = "{ sql:column("PD.Name") }" >
        { 
          concat( string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:WarrantyPeriod)[1]), "-",
                  string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:Description)[1])) 
         } 
     </Product>
 ') as Result
FROM Production.ProductModel PD
WHERE  PD.ProductModelID=28;

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

  • 在 SELECT 子句中,CatalogDescription 是一个 xml 类型列。因此,使用了 query() 方法(XML 数据类型)Instructions.query()。XQuery 语句指定为该查询方法的参数。

  • 对其执行查询的文档将使用命名空间。因此,将使用 namespace 关键字来定义命名空间前缀。有关详细信息,请参阅 XQuery Prolog

结果如下:

<Product ProductModelID="28" ProductModelName="Road-450">1 year-parts and labor</Product>

上一个查询检索了有关特定产品的信息。以下查询将针对为其存储了 XML 目录说明的所有产品检索同样的信息。如果行中的 XML 文档包含 <ProductDescription> 元素,则 WHERE 子句中的 xml 数据类型的 exist() 方法返回 True。

WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)

SELECT CatalogDescription.query('
    <Product 
        ProductModelID= "{ (/pd:ProductDescription/@ProductModelID)[1] }" 
        ProductName = "{ sql:column("PD.Name") }" >
        { 
          concat( string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:WarrantyPeriod)[1]), "-",
                  string((/pd:ProductDescription/pd:Features/wm:Warranty/wm:Description)[1])) 
         } 
     </Product>
 ') as Result
FROM Production.ProductModel PD
WHERE CatalogDescription.exist('//pd:ProductDescription ') = 1

请注意,xml 类型的 exist() 方法所返回的布尔值与 1 进行比较。

实现限制

限制如下:

  • SQL Server 中的 concat() 函数仅接受 xs:string 类型的值。其他值必须显式转换为 xs:string 或 xdt:untypedAtomic 类型。