无法在SQL表中创建包含NULL值的JSON格式的列

问题描述

我需要在一个表中将sql数据与带有JSON格式的列结合在一起。 Json列的长度是可变的,从4到5列。因此,当Length为4时,我需要在JSON字符串中添加一个可选的NULL列。但是,如果将4位Json字符串放入函数中,则不会得到结果

以下功能有什么问题?

DECLARE @json1 nvarchar(max),@json2 nvarchar(max)

--SET @json1 = '{"Inst":[{"id":-627706141,"Instances":"Inst22"}
--,{"id":-627706141,"Instances":"20200605"}
--,"Instances":"Sometghing"}
--,"Instances":"SomeServer"}
--,"Instances":"OptionalServer"}]}'
SET @json1 = '{"Inst":[{"id":1505267576,"Instances":"Inst22"},{"id":1505267576,"Instances":"20190630"},"Instances":"Something"},"Instances":"SomeServer"}]}'
SET @json2 = '{"Value":[{"id":-627706141,"Werte":"Intel(R) Xeon(R) cpu E5-2690 v3 "},"Werte":" 2.60GHz"}]}'

SELECT * 
FROM 
 (
    SELECT *
    FROM OPEnjsON( @json1 )
    WITH
    ( IID sys.int '$.Inst[0].id',sidInstance           sys.NVARCHAR( 50 ) '$.Inst[1].Instances',DatumInstance         sys.NVARCHAR( 50 ) '$.Inst[2].Instances',ServerInstance        sys.NVARCHAR( 50 ) '$.Inst[3].Instances',VirtualServerInstance sys.NVARCHAR( 50 ) '$.Inst[4].Instances',OptionalInstance      sys.NVARCHAR( 50 ) '$.Inst[5].Instances'
    ) a
inner join 
   OPEnjsON( @json2 )
    WITH
    ( WID sys.int '$.Value[0].id',cpuType               sys.NVARCHAR( 50 ) '$.Value[0].Werte',Frequency             sys.NVARCHAR( 50 ) '$.Value[1].Werte'
    ) b on a.IID = b.WID
) t FOR JSON PATH,INCLUDE_NULL_VALUES ``` 

解决方法

id字段值不相等。如果在@ json1中将id字段设置为-627706141,以使其与@ json2匹配,则输出如下所示

[
  {
    "IID": -627706141,"sidInstance": "20190630","DatumInstance": "Something","ServerInstance": "SomeServer","VirtualServerInstance": null,"OptionalInstance": null,"WID": -627706141,"CPUType": "Intel(R) Xeon(R) CPU E5-2690 v3 ","Frequency": " 2.60GHz"
  }
]