适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)

字符串表达式中的运算符,它将两个或多个字符串或二进制字符串、列或字符串和列名的组合串联到一个表达式中(字符串运算符)。 例如, SELECT 'book'+'case'; 返回 bookcase

Transact-SQL 语法约定

expression + expression  

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

expression
字符和二进制数据类型类别中的任何一个数据类型的有效表达式,但 image、ntext 或 text 数据类型除外。 两个表达式必须具有相同的数据类型,或者其中一个表达式必须能够隐式转换为另一个表达式的数据类型。

在二进制字符串之间串联二进制字符串和任何字符串时,必须显式转换字符数据。 以下示例显示了对于二进制串联,何时必须使用 CONVERTCAST,何时不需要使用 CONVERTCAST

DECLARE @mybin1 VARBINARY(5), @mybin2 VARBINARY(5)  
SET @mybin1 = 0xFF  
SET @mybin2 = 0xA5  
-- No CONVERT or CAST function is required because this example   
-- concatenates two binary strings.  
SELECT @mybin1 + @mybin2  
-- A CONVERT or CAST function is required because this example  
-- concatenates two binary strings plus a space.  
SELECT CONVERT(VARCHAR(5), @mybin1) + ' '   
   + CONVERT(VARCHAR(5), @mybin2)  
-- Here is the same conversion using CAST.  
SELECT CAST(@mybin1 AS VARCHAR(5)) + ' '   
   + CAST(@mybin2 AS VARCHAR(5))  

返回优先级最高的参数的数据类型。 有关详细信息,请参阅数据类型优先级 (Transact-SQL)

+(字符串串联)运算符在用于长度为零的空字符串时的作用与用于 NULL 或未知值时不同。 长度为零的字符串可以指定为两个引号,引号内没有任何字符。 长度为零的二进制字符串可以指定为不带以十六进制常量指定的任何字节值的 0x。 串联长度为零的字符串始终要串联上述两个指定的字符串。 处理具有空值的字符串时,串联结果取决于会话设置。 与对空值执行的算术运算一样,当将空值添加到已知值时,结果通常是未知值,对空值执行的字符串串联运算也会产生空的结果。 但是,可以通过更改当前会话的 CONCAT_NULL_YIELDS_NULL 设置来更改此行为。 有关详细信息,请参阅 SET CONCAT_NULL_YIELDS_NULL (Transact-SQL)

如果字符串串联的结果超出 8,000 字节的限值,则结果将被截断。 但是,如果至少其中一个串联的字符串是大值类型,就不会进行截断。

A. 使用字符串串联

以下示例在列标头 Name 下使用多个字符列创建一个列,人员的姓氏后跟随逗号、一个空格,然后是人员的名字。 结果集是按照姓氏,然后按照名字以字母顺序升序排列的。

-- Uses AdventureWorks  
SELECT (LastName + ', ' + FirstName) AS Name  
FROM Person.Person  
ORDER BY LastName ASC, FirstName ASC;  

B. 组合数值和日期数据类型

以下示例使用 CONVERT 函数串联 numeric 和 date 数据类型

-- Uses AdventureWorks  
SELECT 'The order is due on ' + CONVERT(VARCHAR(12), DueDate, 101)  
FROM Sales.SalesOrderHeader  
WHERE SalesOrderID = 50001;  

下面是结果集。

------------------------------------------------  
The order is due on 04/23/2007  
(1 row(s) affected)

C. 使用多个字符串串联

以下示例串联多个字符串,形成一个长字符串,显示 Adventure Works Cycles 的副总裁的姓氏和名字的首字母。 逗号加在姓氏后,句点加在名字首字母后。

-- Uses AdventureWorks  
SELECT (LastName + ',' + SPACE(1) + SUBSTRING(FirstName, 1, 1) + '.') AS Name, e.JobTitle  
FROM Person.Person AS p  
    JOIN HumanResources.Employee AS e  
    ON p.BusinessEntityID = e.BusinessEntityID  
WHERE e.JobTitle LIKE 'Vice%'  
ORDER BY LastName ASC;  

下面是结果集。

Name               Title  
-------------      ---------------`  
Duffy, T.          Vice President of Engineering  
Hamilton, J.       Vice President of Production  
Welcker, B.        Vice President of Sales  
(3 row(s) affected)

D. 在串联中使用大型字符串

以下示例将多个字符串串联成一个长字符串,然后尝试计算最终字符串的长度。 结果集的最后长度为 16000,因为表达式计算从左开始,即 @x + @z + @y => (@x + @z) + @y。 在本例中,(@x + @z) 的结果在 8000 字节处截断,然后将 @y 添加到结果集中,这使得最终的字符串长度为 16000。 由于 @y 为大型值类型字符串时,所以不会发生截断。

DECLARE @x VARCHAR(8000) = REPLICATE('x', 8000)
DECLARE @y VARCHAR(max) = REPLICATE('y', 8000)
DECLARE @z VARCHAR(8000) = REPLICATE('z',8000)
SET @y = @x + @z + @y
-- The result of following select is 16000
SELECT LEN(@y) AS y

下面是结果集。

------- 16000 (1 row(s) affected)

示例:Azure Synapse Analytics 和 Analytics Platform System (PDW)

E. 使用多个字符串串联

以下示例串联多个字符串,形成一个长字符串,显示一个示例数据库中的副总裁的姓氏和名字的首字母。 逗号加在姓氏后,句点加在名字首字母后。

-- Uses AdventureWorks  
SELECT (LastName + ', ' + SUBSTRING(FirstName, 1, 1) + '.') AS Name, Title  
FROM DimEmployee  
WHERE Title LIKE '%Vice Pres%'  
ORDER BY LastName ASC;  

下面是结果集。

Name               Title                                           
-------------      ---------------  
Duffy, T.          Vice President of Engineering  
Hamilton, J.       Vice President of Production  
Welcker, B.        Vice President of Sales  

+=(字符串串联赋值)(Transact-SQL)
ALTER DATABASE (Transact-SQL)
CAST 和 CONVERT (Transact-SQL)
数据类型转换(数据库引擎)
数据类型 (Transact-SQL)
表达式(Transact-SQL)
内置函数 (Transact-SQL)
运算符 (Transact-SQL)
SELECT (Transact-SQL)
SET 语句 (Transact-SQL)