能否在SQL Server 2019的OpenJSON WITH子句中指定文化设置?
问题解答:SQL Server 2019 OpenJSON能否在WITH子句中指定文化解析数值?
很遗憾,SQL Server 2019的OpenJSON并不支持在WITH子句中直接指定文化设置来解析带区域格式的字符串数值。
原因说明
OpenJSON在转换money、float这类数值类型时,默认遵循JSON标准的数值格式逻辑——只识别美式格式的数值字符串(千位分隔符为逗号,小数分隔符为点)。而丹麦格式的数值(千位用点、小数用逗号)不符合这个默认解析规则,所以直接在WITH子句里指定money类型会得到错误结果。
可行的替代方案
虽然不能直接在WITH子句里设置文化,但可以通过以下方式实现正确解析:
1. 先读为字符串,再用TRY_PARSE指定文化(即你当前使用的方案)
这种方式最稳妥,且不会影响会话内的其他操作:
declare @JSON varchar(max)= ' { "Data Table": [ { "Value" : "27.123,49" } ] } ' select TRY_PARSE(Value as money using 'da-dk') "Correct Value" FROM OpenJson(@json, '$."Data Table"') WITH ( "Value" nvarchar(255) N'$."Value"' )
2. 临时设置会话语言(适合批量处理场景)
如果需要批量处理这类数据,可以临时将会话语言切换为丹麦语,之后用TRY_CONVERT直接转换:
-- 保存原会话语言 DECLARE @OriginalLang nvarchar(100) = @@LANGUAGE; -- 设置会话语言为丹麦语 SET LANGUAGE 'Danish'; declare @JSON varchar(max)= ' { "Data Table": [ { "Value" : "27.123,49" } ] } ' select TRY_CONVERT(money, Value) "Correct Value" FROM OpenJson(@json, '$."Data Table"') WITH ( "Value" nvarchar(255) N'$."Value"' ) -- 恢复原会话语言 SET LANGUAGE @OriginalLang;
注意:这种方式是会话级别的设置,会影响当前会话中所有依赖区域设置的操作,使用后记得恢复原语言。
总结
目前没有办法绕过“先读取字符串再转换”的步骤,必须借助TRY_PARSE/TRY_CONVERT并指定文化参数,或者临时调整会话语言来实现丹麦格式数值的正确解析。
内容的提问来源于stack exchange,提问作者Jens Borrisholt
相关产品推荐
相关产品推荐

