+ (字符串串联) (Transact-SQL)
适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库
字符串表达式中的运算符,它将两个或多个字符串或二进制字符串、列或字符串和列名的组合串联到一个表达式中(字符串运算符)。 例如,SELECT 'book'+'case';
返回 bookcase
。
语法
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
在二进制字符串之间串联二进制字符串和任何字符串时,必须显式转换字符数据。
以下示例演示了何时 CONVERT
或 CAST
必须与二进制串联一起使用,以及 CONVERT
何时(或 CAST
)不必使用。
在此示例中,不需要函数 CONVERT
或 CAST
函数,因为此示例连接两个二进制字符串。
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 代码示例使用 AdventureWorks2022
或 AdventureWorksDW2022
示例数据库,可从 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 代码示例使用 AdventureWorks2022
或 AdventureWorksDW2022
示例数据库,可从 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