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

字符串表达式中的运算符,它将两个或多个字符串或二进制字符串、列或字符串和列名的组合串联到一个表达式中(字符串运算符)。

主题链接图标Transact-SQL 语法约定

语法

expression + expression

参数

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

    在二进制字符串之间串联二进制字符串和任何字符串时,必须显式转换字符数据。以下示例显示了对于二进制串联,何时必须使用 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
    -- 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 下使用多个字符串列创建一个列,联系人的姓氏后跟随逗号、一个空格,然后是联系人的名字。结果集是按照姓氏,然后按照名字以字母顺序升序排列的。

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

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

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

USE AdventureWorks;
GO
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/2003            

(1 row(s) affected)

C. 使用多个字符串串联

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

USE AdventureWorks;
GO
SELECT (LastName + ',' + SPACE(1) + SUBSTRING(FirstName, 1, 1) + '.') AS Name, e.Title
FROM Person.Contact AS c
    JOIN HumanResources.Employee AS e
    ON c.ContactID = e.ContactID
WHERE e.Title 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
(3 row(s) affected)