SQL Server连接字符串主要使用“+”运算符和CONCAT函数。“+”运算符直接拼接,但遇NULL时结果为NULL;CONCAT函数自动将NULL转换为空字符串,更安全,CONCAT_WS函数可指定分隔符,简化多字符串拼接,最佳实践:优先用CONCAT避免NULL问题,复杂拼接用CONCAT_WS;大数据量时“+”性能更优,但需处理NULL,注意避免隐式类型转换,确保数据类型一致,提升代码健壮性与可读性。
在SQL Server数据库操作中,字符串连接是最常见的任务之一——无论是拼接用户姓名与邮箱、组合表中的列数据,还是构建动态SQL语句,都离不开字符串连接功能,SQL Server提供了多种字符串连接方式,不同方法在语法、兼容性、NULL值处理及性能上存在差异,本文将详细解析SQL Server中连接字符串的核心方法,帮助开发者根据场景选择最优方案。
字符串连接的核心方法及使用场景
传统加号运算符()
语法:字符串1 + 字符串2
说明:是SQL Server中最基础的字符串连接运算符,适用于所有版本(包括早期版本如SQL Server 2000),其核心逻辑是:当操作数为字符串类型时,执行连接操作;若操作数为数值类型,SQL Server会尝试先转换为字符串再连接(但需注意隐式转换可能带来的性能问题或逻辑错误)。
示例:

-- 连接两个固定字符串 SELECT 'Hello' + ' ' + 'World' AS Result; -- 输出:Hello World -- 连接列数据与固定字符串 SELECT FirstName + ' ' + LastName AS FullName FROM Employees;
注意事项:
- NULL值处理:运算符遵循“NULL传播”规则——只要任一操作数为NULL,结果即为NULL。
SELECT 'Name: ' + NULL AS Result; -- 输出:NULL
若需避免NULL导致的结果中断,需配合
ISNULL或COALESCE函数处理:SELECT 'Name: ' + ISNULL(NULL, 'Unknown') AS Result; -- 输出:Name: Unknown
- 数值类型陷阱:若操作数均为数值类型,会被解释为加法而非连接。
SELECT 1 + 2 AS Result; -- 输出:3(加法),而非'12'(连接)
需确保至少一个操作数为字符串类型,或显式转换:
SELECT CAST(1 AS VARCHAR) + '2' AS Result; -- 输出:12
CONCAT函数(SQL Server 2012+推荐)
语法:CONCAT(字符串1, 字符串2, ...)
说明:SQL Server 2012引入的CONCAT函数是现代字符串连接的首选方法,它解决了运算符的NULL值痛点——自动将NULL转换为空字符串(''),避免结果中断。CONCAT支持多个参数(最多254个),语法更简洁。
示例:
-- 自动处理NULL值
SELECT CONCAT('Name: ', NULL, ' ', 'User') AS Result; -- 输出:Name: User
-- 连接多个列
SELECT CONCAT(FirstName, ' ', LastName, ' (', Department, ')') AS EmployeeInfo
FROM Employees;
注意事项:
- 数据类型转换:
CONCAT会自动将所有参数转换为字符串类型(包括数值、日期等),无需手动CAST。SELECT CONCAT(1, '2', 3.14, ' - PI') AS Result; -- 输出:123.14 - PI
- 版本兼容性:仅适用于SQL Server 2012及以上版本,旧版本(如2008/R2)不支持。
CONCAT_WS函数(SQL Server 2017+高效分隔连接)
语法:CONCAT_WS(分隔符, 字符串1, 字符串2, ...)
说明:CONCAT_WS(Concatenate With Separator)是SQL Server 2017新增的函数,扩展了CONCAT的功能——自动忽略NULL值,并以指定分隔符连接非NULL字符串,特别适合需要分隔符的场景(如姓名拼接“姓,名”、地址拼接“省-市-区”)。
示例:
-- 指定分隔符,自动忽略NULL
SELECT CONCAT_WS(', ', 'Zhang', NULL, 'San', 'Engineer') AS Result; -- 输出:Zhang, San, Engineer
-- 拼接地址(以“-”分隔,自动跳过NULL的区)
SELECT CONCAT_WS('-', 'Beijing', 'Haidian', NULL, 'China') AS Address; -- 输出:Beijing-Haidian-China
注意事项:
- NULL值处理:与
CONCAT不同,CONCAT_WS会直接忽略NULL参数,而非替换为空字符串,避免多余的分隔符。 - 分隔符规则:若分隔符本身为NULL,函数会返回NULL(需确保分隔符非NULL)。
与NULLIF组合(高级场景下的NULL控制)
语法:字符串1 + NULLIF(字符串2, '')
说明:在需要严格区分“空字符串”和“NULL”的场景(如数据清洗),可通过NULLIF将空字符串转换为NULL,再配合运算符实现自定义NULL处理逻辑,当某列值为空字符串时,希望将其视为NULL而非参与连接。
示例:
-- 若MiddleName为空字符串,则视为NULL,不参与连接
SELECT FirstName + ' ' +
CASE
WHEN NULLIF(MiddleName, '') IS NULL THEN ''
ELSE MiddleName + ' '
END +
LastName AS FullName
FROM Employees;
方法对比与选择建议
| 方法 | 支持版本 | NULL值

