CONCAT_WS (Transact-SQL)

适用于: SQL Server 2017 (14.x) 及更高版本 Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics

此函数以端到端的方式返回从串联或联接的两个或更多字符串值生成的字符串。 它会用第一个函数参数中指定的分隔符分隔连接的字符串值。 (CONCAT_WS 指示使用分隔符连接。)

语法

CONCAT_WS ( separator, argument1, argument2 [, argumentN]... )

注意

若要查看 SQL Server 2014 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

分隔符:任何字符类型的表达式(charncharnvarcharvarchar)。

argument1、argument2、argumentN:任何类型的表达式。 CONCAT_WS 函数需要至少两个自变量,并且不得超过 254 个自变量。

返回类型

长度和类型取决于输入的字符串值。

备注

CONCAT_WS 采用可变数量的字符串自变量,并将它们串联(或联接)成单个字符串。 它会用第一个函数参数中指定的分隔符分隔连接的字符串值。 CONCAT_WS 需要分隔符参数和两个其他字符串值参数的最小值,否则,CONCAT_WS 将引发错误。 CONCAT_WS 在串联前会将所有自变量隐式转换为字符串类型。

隐式转换为字符串的过程遵循现有的数据类型转换规则。 请参阅 CONCAT (Transact SQL) 获取有关行为和数据类型转换的详细信息。

NULL 值处理方式

CONCAT_WS 忽略 SET CONCAT_NULL_YIELDS_NULL {ON|OFF} 设置。

如果 CONCAT_WS 接收到全部为 NULL 值的自变量,它将返回类型为 varchar(1) 的空字符串。

串联过程中 CONCAT_WS 会忽略 Null 值,并且不会在 null 值之间添加分隔符。 因此,CONCAT_WS 可以完全处理可能具有“空”值(例如,次要地址字段)的字符串串联。 请参阅示例 B 获取详细信息。

如果方案涉及由分隔符分隔的 null 值,请考虑 ISNULL 函数。 请参阅示例 C 获取详细信息。

示例

A. 使用分隔符连接值

此示例串联 sys.databases 表中的三列,并使用 - 分隔这些值。

SELECT CONCAT_WS( ' - ', database_id, recovery_model_desc, containment_desc) AS DatabaseInfo
FROM sys.databases;

下面是结果集。

DatabaseInfo
1 - SIMPLE - NONE
2 - SIMPLE - NONE
3 - FULL - NONE
4 - SIMPLE - NONE

B. 跳过 NULL 值

此示例忽略参数列表中的 NULL 值。

SELECT CONCAT_WS(',','1 Microsoft Way', NULL, NULL, 'Redmond', 'WA', 98052) AS Address;

下面是结果集。

Address
------------   
1 Microsoft Way,Redmond,WA,98052

C. 从表生成 CSV 格式的数据

此示例使用逗号 , 作为分隔符,并在结果集的列分隔值格式中添加回车符 char(13)

SELECT 
STRING_AGG(CONCAT_WS( ',', database_id, recovery_model_desc, containment_desc), char(13)) AS DatabaseInfo
FROM sys.databases

下面是结果集。

DatabaseInfo
------------   
1,SIMPLE,NONE
2,SIMPLE,NONE
3,FULL,NONE 
4,SIMPLE,NONE 

CONCAT_WS 会忽略列中的 NULL 值。 用 ISNULL 函数包装可以为 null 的列,并提供默认值。 参阅此示例获取详细信息:

SELECT 
STRING_AGG(CONCAT_WS( ',', database_id, ISNULL(recovery_model_desc,''), ISNULL(containment_desc,'N/A')), char(13)) AS DatabaseInfo
FROM sys.databases;

另请参阅

CONCAT (Transact-SQL)
FORMATMESSAGE (Transact-SQL)
QUOTENAME (Transact-SQL)
REPLACE (Transact-SQL)
REVERSE (Transact-SQL)
STRING_AGG (Transact-SQL)
STRING_ESCAPE (Transact-SQL)
STUFF (Transact-SQL)
TRANSLATE (Transact-SQL)
字符串函数 (Transact-SQL)