来自OPENJONS()的TSQL,具有显式架构:十进制(38,30)数据类型的空字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来自OPENJONS()的TSQL,具有显式架构:十进制(38,30)数据类型的空字符串相关的知识,希望对你有一定的参考价值。

当它为空字符串时,我无法获得from openjson()进行转换,转换或识别decimal(38,30)数据类型。由于某种原因,我必须明确将其声明为varchar(39)。为什么?否则,我得到错误Error converting data type varchar to numeric,我将进一步说明:

我最终要构建一个UPDATE语句,但是我简化了此SO问题中显示的示例。该临时表对应于我的实际目标表;数据类型是准确的。

declare @tmpSchedules table (
    [EffectDate] [smalldatetime] null,
    [Description] [varchar](30) null,
    [Calculated] [bit] not null,
    [BaseSchedule] [varchar](9) null,
    [Factor] [decimal](38, 30) null
    )

这是我的传入数据。这是一个JSON字符串。请注意,该因素可能是:1)完全从结构中丢失,2)空字符串,或3)decimal(38,30)值。

declare @jsonRequest nvarchar(max) =
'{
    "EffectDate": "2021-04-01",
    "Description": "",
    "Calculated": "",
    "Factor": "",
    "BaseSchedule": null
}'

/*
        ==FACTORS==

NULL (missing from structure)     --->>> from openjson() can handle this

"Factor": "",     --->>> from openjson() CAN NOT handle this!!!

"Factor": "0.411334674542662787386271222800",     --->>> from openjson() can handle this

*/

当我将其声明为decimal时,则它不能为空字符串,否则我将得到此信息:Error converting data type varchar to numeric。由于它是decimal,因此我想将其声明为十进制。我不想将其声明为varchar

此外,如果它是一个空字符串或实际上为空,我需要选择NULLnullif(Factor, '') as Factor

无论如何,我对json_value()json_query()感到更幸运,所以也许我应该只改变策略?

是我对from openjson()的期望不正确,还是这是强制转换/转换/数据类型问题?

select
    EffectDate
    ,Description
    ,Calculated
    ,BaseSchedule
    ,Factor
    --,nullif(Factor, '') as Factor
from openjson(@jsonRequest, '$')
with
(
    EffectDate [smalldatetime] '$.EffectDate'
    ,Description [varchar](30) '$.Description'
    ,Calculated [bit] '$.Calculated'
    ,BaseSchedule [varchar](9) '$.BaseSchedule'
    ,Factor [decimal](38, 30) '$.Factor' --Error converting data type varchar to numeric.
    --,Factor [varchar](39) '$.Factor'

)
答案

这里我们转换字符串。这样,空值将不会失败

示例

declare @jsonRequest nvarchar(max) =
'{
    "EffectDate": "2021-04-01",
    "Description": "",
    "Calculated": "",
    "Factor": "0.411334674542662787386271222800",
    "BaseSchedule": null
}'


select
    EffectDate
    ,Description
    ,Calculated
    ,BaseSchedule
    ,Factor  = try_convert(decimal(38,30),Factor)    --<<< Notice the try_convert()
from openjson(@jsonRequest, '$')
with
(
    EffectDate [smalldatetime] '$.EffectDate'
    ,Description [varchar](30) '$.Description'
    ,Calculated [bit] '$.Calculated'
    ,BaseSchedule [varchar](9) '$.BaseSchedule'
    ,Factor [varchar](39) '$.Factor'
)

返回

EffectDate              Description Calculated  BaseSchedule    Factor
2021-04-01 00:00:00                 0           NULL            0.411334674542662787386271222800

以上是关于来自OPENJONS()的TSQL,具有显式架构:十进制(38,30)数据类型的空字符串的主要内容,如果未能解决你的问题,请参考以下文章

请帮助将 Tsql“隐式连接”转换为显式连接

TSQL - 来自 Excel 导入数据的 UNPIVOT

TSQL 数据类型转换

TSQL 多个连接与来自 ASP.NET Core 的多个请求?

TSQL:解析具有各种字符的字符串

具有动态偏移量的 TSQL 复制 LAG() 函数