CONCAT (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

此函数以端到端的方式返回从串联或联接的两个或更多字符串值生成的字符串。

注意

若要在串联过程中添加分隔值,请使用 CONCAT_WS

Transact-SQL 语法约定

语法

CONCAT ( argument1 , argument2 [ , argumentN ] ... )

注意

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

自变量

argument1, argument2 [ , argumentN ]

任意字符串值的表达式。 CONCAT 函数需要至少两个自变量,并且不得超过 254 个自变量。

返回类型

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

备注

CONCAT 采用可变数量的字符串自变量,并将它们串联(或联接)成单个字符串。 需要至少两个输入值;否则 CONCAT 将引发错误。 CONCAT 在串联前会将所有自变量隐式转换为字符串类型。 CONCAT 会将 Null 值隐式转换为空字符串。 如果 CONCAT 接收到全部为 NULL 值的自变量,它将返回类型为 varchar(1) 的空字符串。 隐式转换为字符串的过程遵循现有的数据类型转换规则。 有关数据类型转换的详细信息,请参阅 CAST 和 CONVERT (Transact-SQL)

返回类型取决于参数的类型。 此表将说明这一映射:

输入类型 输出类型和长度
1. SQL-CLR 系统类型的任意自变量, SQL-CLR UDT 或 nvarchar(max) nvarchar(max)
2. 或者类型为 varbinary (max) 或 varchar(max) 的任何自变量 varchar(max),除非其中一个参数是任意长度的 nvarchar。 在这种情况下,CONCAT 将返回类型 nvarchar(max) 的结果。
3.或者为类型 nvarchar 的任何自变量,最多为 4000 个字符 (nvarchar(<= 4000))4,000 nvarchar(<= 4000)
4.在所有其他情况下 类型为 varchar 的任何自变量,最多为 8000 个字符 (varchar(<= 8000)),除非其中一个参数是任意长度的 nvarchar。 在那种情况下,CONCAT 将返回类型 nvarchar(max) 的结果

CONCAT 接收到长度 <= 4000 个字符的 nvarchar 输入自变量或 <= 8000 个字符的 varchar 输入自变量时,隐式转换可能会影响结果的长度。 当将其他数据类型隐式转换为字符串时,它们具有不同长度。 例如,值为 14 的 int 的字符串长度为 2,而值为 1234.56789 的 float 的字符串长度为 7 (1234.57)。 因此,两个整数的串联将返回长度小于 9 个字符的结果。

如果没有任何输入自变量具有支持的大型对象 (LOB) 类型,返回类型的长度则截断为 8000 个字符,而不考虑返回类型。 这种截断可节约空间并支持计划生成的效率。

可以在运行 SQL Server 2012 (11.x) 和更高版本的链接服务器上远程执行 CONCAT。 对于较低版本的链接服务器,在链接服务器返回非串联值后,将在本地执行 CONCAT 操作。

示例

A. 使用 CONCAT

SELECT CONCAT ('Happy ', 'Birthday ', 11, '/', '25') AS Result;

下面是结果集:

Result
--------------------
Happy Birthday 11/25

B. 使用 CONCAT 以及 NULL 值

CREATE TABLE #temp (
    emp_name NVARCHAR(200) NOT NULL,
    emp_middlename NVARCHAR(200) NULL,
    emp_lastname NVARCHAR(200) NOT NULL
    );

INSERT INTO #temp
VALUES ('Name', NULL, 'Lastname');

SELECT CONCAT (emp_name, emp_middlename, emp_lastname) AS Result
FROM #temp;

下面是结果集:

Result
------------
NameLastname