问题描述
我需要在一个表中将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"
}
]