+ (字符串串联) (Transact-SQL)

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

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

Transact-SQL 语法约定

语法

expression + expression

参数

expression

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

返回类型

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

注解

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

零长度字符串和字符

字符串 + 串联运算符在处理空字符串、零长度字符串时的行为与处理 NULL值或未知值时的行为不同。 长度为零的字符串可以指定为两个引号,引号内没有任何字符。 可以将零长度二进制字符串指定为 0x 没有十六进制常量中指定的任何字节值。 串联长度为零的字符串始终要串联上述两个指定的字符串。

NULL 值的串联

使用具有 NULL 值的字符串时,串联的结果取决于会话设置。 与对 NULL 值执行的算术运算一样,将值添加到已知值时 NULL ,结果通常是未知值,则使用值执行的 NULL 字符串串联运算也应产生结果 NULL

但是,可以通过更改当前会话的 CONCAT_NULL_YIELDS_NULL 设置来更改此行为。 有关详细信息,请参阅 SET CONCAT_NULL_YIELDS_NULL

必要时使用 CAST 和 CONVERT

在二进制字符串之间串联二进制字符串和任何字符串时,必须显式转换字符数据。

以下示例演示了何时 CONVERTCAST必须与二进制串联一起使用,以及 CONVERT何时(或 CAST)不必使用。

在此示例中,不需要函数 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;

在此示例中,需要一个或CAST一个CONVERT函数,因为此示例连接两个二进制字符串和一个空格。

DECLARE @mybin1 VARBINARY(5), @mybin2 VARBINARY(5);

SET @mybin1 = 0xFF;
SET @mybin2 = 0xA5;

-- 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 代码示例使用 AdventureWorks2022AdventureWorksDW2022 示例数据库,可从 Microsoft SQL Server 示例和社区项目主页下载它。

A. 使用字符串串联

以下示例从多个字符列创建列标题 Name 下的单个列,该列的姓氏后跟逗号、单个空格,然后创建该人员的名字。 结果集按系列名称按升序、按字母顺序排列,然后按名字排列。

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

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

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

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

结果集如下。

------------------------------------------------
The order is due on 04/23/2007

°C 使用多个字符串串联

以下示例连接多个字符串以形成一个长字符串,以显示家族名称和 Adventure Works Cycles 中副总裁的第一个首字母首字母。 在系列名称和第一个初始后的句点后面添加一个逗号。

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;
GO

结果集如下。

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

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

以下示例将多个字符串串联成一个长字符串,然后尝试计算最终字符串的长度。 结果集的最终长度为 16,000,因为表达式计算从左侧开始,@x + @y@z + 即 => (@x + @z) + 。 @y 在这种情况下,将 (@x + @z) 的结果截断为 8,000 字节,然后将其 @y 添加到结果集中,从而使最终字符串长度为 16,000。 由于 @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
GO

结果集如下。

y
-------
16000

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

本文中的 Transact-SQL 代码示例使用 AdventureWorks2022AdventureWorksDW2022 示例数据库,可从 Microsoft SQL Server 示例和社区项目主页下载它。

E. 使用多个字符串串联

以下示例连接多个字符串以形成一个长字符串,以显示姓氏和示例数据库中副总裁的第一个首字母首字母。 在系列名称和第一个初始后的句点后面添加一个逗号。

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