基于字符串值的函数 - concat

适用于:SQL Server

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

语法

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

参数

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

备注

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

补充字符(代理项对)

XQuery 函数中代理对的行为依赖于数据库兼容级别,并且在某些情况下,还依赖于函数的默认命名空间 URI。 有关详细信息,请参阅主题 2016 SQL Server 2016 中数据库引擎功能的中断性变更中的“XQuery 函数是代理项感知”部分。 另请参阅 ALTER DATABASE 兼容性级别 (Transact-SQL) 排序规则和 Unicode 支持

示例

本主题针对存储在 AdventureWorks 示例数据库中各种 xml 类型列中的 XML 实例提供 XQuery 示例。

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

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

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 语句指定为该查询方法的参数。

  • 对其执行查询的文档将使用命名空间。 因此, 命名空间 关键字用于定义命名空间的前缀。 有关详细信息,请参阅 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 类型。

另请参阅

针对 xml 数据类型的 XQuery 函数