错误。sql server 2022 及以后版本原生支持 greatest 函数,适用于 azure sql 数据库、managed instance、synapse analytics 等环境,语法为 greatest(expr1, expr2, ..., exprn),最多支持 254 个参数,自动忽略 null,返回最高优先级数据类型的最大值。

SQL Server 2022 并没有 GREATEST 函数
直接说结论:GREATEST 是 MySQL、PostgreSQL 等数据库的函数,SQL Server 原生不支持。哪怕在 2022 版本中,官方文档和实际测试都确认它不存在——你执行 SELECT GREATEST(1, 2, 3) 会收到错误:Invalid column name 'GREATEST' 或更明确的 ‘GREATEST’ is not a recognized built-in function name。
替代方案:用 VALUES 子句 + MAX 实现等效逻辑
SQL Server 2016+(包括 2022)支持行构造器 VALUES,配合 MAX() 可安全、高效地模拟 GREATEST 行为。这是目前最推荐的做法,语义清晰且无需动态 SQL。
例如取三列 col_a、col_b、col_c 的最大值:
SELECT (SELECT MAX(v) FROM (VALUES (col_a), (col_b), (col_c)) AS value_list(v)) AS greatest_val FROM your_table;
- 必须用子查询包裹,因为
VALUES不能直接出现在SELECT列表中(除非作为派生表) -
v是别名,可任意命名,但必须存在;括号不能省略:(col_a)是单列行,col_a单独写会报错 - 支持 NULL:如果所有值都是 NULL,结果为 NULL;只要有一个非 NULL,就返回其中最大非 NULL 值
- 类型需兼容,比如不能混用
INT和DATETIME,否则报错Cannot convert a value of type 'datetime' to type 'int'
其他可行但不推荐的方式
虽然能用,但各有明显缺陷,容易踩坑:
-
CASE WHEN链:列一多就爆炸,3 列需 3 个分支,5 列要写 10+ 行嵌套,易错难维护 -
UNPIVOT:需要先转置,对 NULL 处理麻烦,语法冗长,性能不如VALUES方案 - 自定义函数(如
dbo.GREATEST):引入额外对象,跨库迁移麻烦,且无法内联展开,可能影响执行计划 - 升级到 Azure SQL?也不行——Azure SQL 同样不支持
GREATEST,这点常被误传
注意 VALUES 方案在复杂表达式中的写法
如果参与比较的是计算字段或函数调用(比如 LEN(name)、ISNULL(price, 0)),必须确保它们在 VALUES 中被正确包裹:
SELECT
(SELECT MAX(v) FROM (VALUES
(ISNULL(col_a, 0)),
(col_b * 1.1),
(LEN(col_c))
) AS t(v)) AS calc_greatest
FROM your_table;
漏掉括号或写成 VALUES (ISNULL(col_a, 0), col_b * 1.1, LEN(col_c)) 会变成单行三列,MAX(v) 就失效了——这是最常被忽略的语法细节。










