Я могу воспроизвести проблему из вопроса с помощью следующего контрольного примера.
Таблица и JSON:
DECLARE @ts AS TABLE(Json_Table nvarchar(max))
INSERT INTO @ts VALUES (N'{
"Items":[
[
{
"Name":"ItemCode",
"Value":"KA-2-1-SPD"
},
{
"Name":"Country",
"Value":"AU"
},
{
"Name":"MSRP",
"Value":"150.00000000"
},
{
"Name":"_ItemId",
"Value":"PBT=[ue_BBL_MSRPPricing] MSRP.DT=[2020-02-07 13:27:35.097] MSRP.ID=[a4bdcc19-d00c-4fe7-9ad0-4e6b4aaa9cbb]"
}
]
]
}')
Оператор с пустым результатом:
SELECT *
FROM OPENJSON((select * from @ts),'$."Items"') WITH (
Number varchar(200) '$.Name',
Number varchar(200) '$.Value'
) a
Важным вопросом является точный формат возврата JSON (результат вызова exec [dbo].APICaller_GET_headers @wurl, @header
). Если приведенный выше тестовый случай соответствует реальному случаю, вам нужно проанализировать этот JSON с помощью дополнительного OPENJSON()
вызова:
SELECT j2.*
FROM @ts t
CROSS APPLY OPENJSON(t.Json_Table, '$."Items"') j1
CROSS APPLY OPENJSON(j1.[value], '$') WITH (
Number varchar(200) '$.Name',
Number varchar(200) '$.Value'
) j2
-- or
SELECT j.*
FROM @ts t
CROSS APPLY OPENJSON(t.Json_Table, '$.Items[0]') WITH (
Number varchar(200) '$.Name',
Number varchar(200) '$.Value'
) j
Результат:
Number Number
ItemCode KA-2-1-SPD
Country AU
MSRP 150.00000000
_ItemId PBT=[ue_BBL_MSRPPricing] MSRP.DT=[2020-02-07 13:27:35.097] MSRP.ID=[a4bdcc19-d00c-4fe7-9ad0-4e6b4aaa9cbb]
Если вы хотите получить ItemCode
, Country
, MSRP
и _ItemId
в качестве столбцов, вы можете использовать PIVOT
или агрегирование:
SELECT
MAX(CASE WHEN LOWER(Name) = 'itemcode' THEN value END) AS ItemCode,
MAX(CASE WHEN LOWER(Name) = 'country' THEN value END) AS Country,
MAX(CASE WHEN LOWER(Name) = 'msrp' THEN value END) AS MSRP,
MAX(CASE WHEN LOWER(Name) = '_itemid' THEN value END) AS ItemId
FROM (
SELECT j2.*
FROM @ts t
CROSS APPLY OPENJSON(t.Json_Table, '$."Items"') j1
CROSS APPLY OPENJSON(j1.[value], '$') WITH (
Name varchar(200) '$.Name',
Value varchar(200) '$.Value'
) j2
) x