T-SQL是否支持数字分隔符拆分大数字字面量提升源码可读性
T-SQL 数字分隔符特性支持说明
核心结论
截止目前所有正式发布的T-SQL版本(含SQL Server 2022、Azure SQL Database、Azure SQL Managed Instance最新可用版本),均不支持类似JavaScript、C#的下划线数字分隔符(numeric/digit separators)特性。
你之前测试的SELECT 3_800_000写法确实会被T-SQL词法解析器识别为「返回数字常量3,同时给该列设置别名_800_000」,等价于SELECT 3 AS [_800_000],完全无法得到预期的3800000数值,直接使用会引发逻辑错误。
源码层面提升大数字字面量可读性的可行方案
以下方案均不改变实际执行逻辑,不会额外带来性能损耗,仅用于提升源码易读性:
- 提前定义变量/常量承载大数值
这是生产环境最推荐的写法,既可以统一管理魔法值,也可以通过命名、注释直接说明数值含义:
对于需要跨批次、跨语句复用的固定数值,也可以定义为内联标量函数返回常量值,SQL Server优化器会直接将其折叠为对应常量,不会有函数调用开销。-- 配置项:用户分层阈值,对应380万累计积分 DECLARE @VIPPointThreshold BIGINT = 3800000; SELECT * FROM UserInfo WHERE TotalPoint >= @VIPPointThreshold; - 用常量算术表达式拆分数字
如果不想额外定义变量,可以通过乘10的整数次幂的方式按量级拆分数字,查询优化器在执行计划生成阶段会提前计算好常量表达式的最终值,运行时无额外计算成本:-- 等价于直接写3800000 SELECT * FROM OrderLog WHERE TotalAmount >= 3 * 1000000 + 800 * 1000; - 紧邻字面量添加注释说明
对于仅单次使用的大数值,可以直接在数值后添加行内注释标注量级、含义,不影响语法解析:SELECT * FROM SysConfig WHERE ConfigValue = 3800000 /* 单实例最大连接数阈值 */
注意:不要尝试通过添加空格、下划线等符号直接拆分数字字面量,这类写法要么触发语法错误,要么会被解析为列别名,导致查询逻辑不符合预期。
内容的提问来源于stack exchange,提问作者KyleMit
相关产品推荐
相关产品推荐

