来自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
!
此外,如果它是一个空字符串或实际上为空,我需要选择NULL
:nullif(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)数据类型的空字符串的主要内容,如果未能解决你的问题,请参考以下文章