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

适用于:Azure SQL 数据库

||字符串表达式中的管道运算符将两个或多个字符或二进制字符串、列或字符串和列名称的组合连接到一个表达式(字符串运算符)。 例如,SELECT 'SQL ' || 'Server'; 返回 SQL Server

Transact-SQL 语法约定

语法

expression || expression

参数

expression

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

返回类型

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

注解

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

零长度字符串和字符

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

NULL 值的串联

与对 NULL 值执行的算术运算一样,将值添加到已知值时 NULL ,结果通常是一个 NULL 值。 使用 NULL 值执行的字符串串联操作也应生成结果 NULL

运算符||不遵循该SET CONCAT_NULL_YIELDS_NULL选项,并且总是像启用 ANSI SQL 行为一样的行为,如果任一输入是NULL,则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 下创建一列,该列的姓氏(LastName)后跟逗号、单个空格,然后创建该人员的名字(FirstName)。 结果集按系列名称按升序、按字母顺序排列,然后按名字排列。

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