Не удалось создать столбец в формате JSON в таблице SQL с включением нулевых значений

#json #sql-server #open-json #for-json

#json #sql-server #открыть-json #для-json

Вопрос:

Мне нужно объединить в одной таблице данные SQL со столбцами, отформатированными как JSON. Столбцы Json имеют различную длину, от 4 до 5 столбцов. Поэтому мне нужно добавить один необязательный столбец NULL в строку JSON, когда длина равна 4. Но если я добавлю строку Json из 4 мест в свою функцию, я не получу никаких результатов

Что не так в функции folowing?

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

--SET @json1 = '{"Inst":[{"id":-627706141,"Instances":"Inst22"}
--,{"id":-627706141,"Instances":"20200605"}
--,{"id":-627706141,"Instances":"Sometghing"}
--,{"id":-627706141,"Instances":"SomeServer"}
--,{"id":-627706141,"Instances":"OptionalServer"}]}'
SET @json1 = '{"Inst":[{"id":1505267576,"Instances":"Inst22"}
,{"id":1505267576,"Instances":"20190630"}
,{"id":1505267576,"Instances":"Something"}
,{"id":1505267576,"Instances":"SomeServer"}]}'
SET @json2 = '{"Value":[{"id":-627706141,"Werte":"Intel(R) Xeon(R) CPU E5-2690 v3 "},{"id":-627706141,"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 ``` 
  

Комментарии:

1. Каков ожидаемый результат, когда идентификаторы @json1 @json2 переменных и отличаются (как в вашем текущем примере)?

Ответ №1:

Значения поля id не равны. Если для поля id установлено значение -627706141 в @json1, чтобы оно соответствовало @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"
  }
]
  

Комментарии:

1. Большое вам спасибо! Это было причиной