sql server 2019 不支持 trim 函数,因其仅从 sql server 2022(兼容级别 160+)开始原生支持;替代方案为 rtrim(ltrim()) 处理空格,但对制表符、换行等无效。

TRIM 在 SQL Server 2019 中不可用 —— 它只从 SQL Server 2022(兼容级别 160+)开始原生支持。
SQL Server 2019 不支持 TRIM 函数
直接执行 SELECT TRIM(' abc ') 会报错:Invalid column name 'TRIM'。这不是拼写或权限问题,而是语法层面不识别该函数名。SQL Server 2019 最高兼容级别为 150,而 TRIM 的完整语法(含 LEADING/TRAILING/BOTH 和 FROM 子句)依赖兼容级别 160。
- 即使你手动升级数据库兼容级别到 160(
ALTER DATABASE ... SET COMPATIBILITY_LEVEL = 160),SQL Server 2019 内核仍无法解析TRIM—— 兼容级别升级不能突破版本限制 - 试图用
TRIM('x' FROM col)或TRIM(BOTH 'x' FROM col)同样失败,错误类型一致 - 别被某些“兼容模式开启就能用”的博客误导:函数存在性由 SQL Server 实例版本决定,不是兼容级别开关能打开的
替代方案:用 RTRIM(LTRIM()) 处理空格
这是最稳妥、全版本通用的方式,专用于移除 ASCII 空格(CHAR(32)):
SELECT RTRIM(LTRIM(' hello world ')) AS result;
- 结果是
'hello world',和预期一致 - 嵌套顺序无关紧要:
LTRIM(RTRIM(...))效果相同 - 注意:它对制表符(
CHAR(9))、换行(CHAR(10))、回车(CHAR(13))或不间断空格(CHAR(160))完全无效
如果要移除非空格字符(如 '*' 或 '#')
SQL Server 2019 没有等效于 TRIM('*' FROM col) 的单函数,必须组合 REPLACE + 首尾定位逻辑,或用 SUBSTRING + CHARINDEX 手动截取:
DECLARE @s NVARCHAR(50) = '***hello***';
SELECT
SUBSTRING(
@s,
NULLIF(CHARINDEX('*', REVERSE(@s)), 0) + 1,
LEN(@s) - 2 * NULLIF(CHARINDEX('*', REVERSE(@s)), 0)
) AS trimmed;
- 上面逻辑仅适用于两端**等长**重复字符;实际中更推荐先确认数据规律,再决定是否用循环
WHILE CHARINDEX剥离,或改用应用层处理 - 若只是偶尔清洗,用 SSMS 执行一次
UPDATE t SET col = LTRIM(RTRIM(REPLACE(REPLACE(col, CHAR(10), ''), CHAR(13), '')))更直接 - 别在
WHERE条件里写RTRIM(LTRIM(col)) = 'value'—— 索引照样失效,和TRIM()一样
真正需要 TRIM 的多字符、多方向、标准语法支持,得升级到 SQL Server 2022 或迁移到 Azure SQL 数据库(已默认支持)。在 2019 环境里硬套标准 SQL 的 TRIM 写法,只会卡在语法错误上,连运行都做不到。










