SQL Server中FORMAT函数处理数值返回4000长度varchar的原因是什么
SQL Server FORMAT函数返回固定长字符串的设计逻辑
核心原因如下:
- FORMAT是SQL Server提供的CLR托管函数,底层完全依赖.NET Framework的格式化能力实现,数值、日期等类型的格式化逻辑直接调用.NET内置的
String.Format方法,返回值对应.NET的String类型。 - 在SQL Server的CLR类型映射规则中,未显式指定长度的可变长字符串,默认匹配的类型就是nvarchar(4000)(如果你观测到返回varchar,属于后续隐式类型转换的结果)。4000字符是SQL Server单行非大值类型字符串的常规长度上限,既可以覆盖绝大多数格式化场景的输出需求,也不会引入
nvarchar(max)大值类型带来的额外性能损耗。 - 没有根据格式化参数动态推断返回长度,是为了保证类型系统的确定性:格式化的输出长度会受很多动态因素影响,比如区域设置(同样的日期格式,不同语言的月份名称长度差异极大)、输入值范围、格式串是否为动态字段值等,如果动态计算长度会大幅提升函数开销,还会出现同个查询不同行返回值类型不一致的问题,不符合T-SQL的类型设计规范。
你给出的示例查询:
select format(1,'00')
执行后实际返回的内容是01,虽然有效长度只有2位,但类型依然是默认的nvarchar(4000)。
内容的提问来源于stack exchange,提问作者VVT
相关产品推荐
相关产品推荐

