||(字符串串联)(Transact-SQL)
适用于:Azure SQL 数据库Azure SQL 托管实例Microsoft Fabric 中的 SQL 数据库
||
字符串表达式中的管道运算符将两个或多个字符或二进制字符串、列或字符串和列名称的组合连接到一个表达式(字符串运算符)。 例如,SELECT 'SQL ' || 'Server';
返回 SQL Server
。
||
运算符遵循 ANSI SQL 标准来连接字符串。 在 SQL Server 中,还可以使用 +
运算符和 CONCAT()
函数执行字符串串联。
语法
expression || expression
参数
expression
字符和二进制数据类型类别中任一数据类型的任何有效表达式,xml、json、image、ntext 或文本数据类型除外。 两个表达式必须具有相同的数据类型,或者其中一个表达式必须能够隐式转换为另一个表达式的数据类型。
返回类型
返回优先级最高的参数的数据类型。 有关详细信息,请参阅 数据类型优先级。
注解
使用 ANSI 字符串串联语法的一些好处包括:
可移植性:使用 ANSI 标准
||
运算符进行字符串串联可确保 SQL 代码可跨不同的数据库系统移植。 这意味着可以在各种数据库平台上运行相同的 SQL 查询,而无需修改。一致性:遵循 ANSI 标准可提升 SQL 代码中的一致性,从而更轻松地读取和维护,尤其是在使用多个数据库系统的环境中工作时。
互操作性:ANSI 标准受到大多数符合 SQL 的数据库系统的广泛认可和支持,增强了不同系统和工具之间的互操作性。
字符串截断行为
如果字符串串联的结果超出 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
在二进制字符串之间串联二进制字符串和任何字符串时,必须显式转换字符数据。
以下示例演示了何时 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
在此示例中,需要一个或CONVERT
一个CAST
函数,因为此示例连接两个二进制字符串和一个空格。
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
下创建一列,该列的姓氏(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
+ @z
+ @y
即 => (@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