You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:11:07