Чтение API JSON в SQL - PullRequest
       3

Чтение API JSON в SQL

0 голосов
/ 25 марта 2020

Я пытаюсь напрямую прочитать API в базу данных SQL.

--Set Header
Declare @header nvarchar(max) = '[{
                                  "Name": "Authorization",
                                  "Value" :"b/XdI6IQzCviZOGJ0E+002DasdoKUFOPmVDkwpQDbQjm3w/qkdxDUzmqvSYEZDCmJGWpA23OTlhFpxRHFz3WOsvay8V58XdIp/UIsr5TpCdMwtW3QsadasdXF2ahwQYp2O6GzKlJciZKZNZjg+W7wqdlB75asdasdasu/p8isu1SLy9b32gS33LR1Ievk/eYZdjPLP4Mx6qZH10yo1UvDfMhHjRw4UrYLOR/44BEW4hON0C+qfessG5+oFgg2J+RrUyfbcIvUz7DG1LUohmyDWJclSC7qqqYRFWVZG2GjwXbeHbTbAfoDa/0Q9iZNanAOJ4ElG/3/hukeFBWQBOI+cGURskFvrHKLGgLReHRM4kZFtlOg+5kzilw6pkH8hqutxT77otJKwH+iYRzH5lgbC"
                                }]';
--Set URL
Declare @wurl varchar(max) = 'https://in901.eu1.qb.com/IDORequestService/MGRestService.svc/json/ue_BBL_MSRPPricings/ItemCode,Country,MSRP/adv/?filter=ItemCode=''KA-2-1-SPD'' AND Country=''AU''' 

Declare @ts as table(Json_Table nvarchar(max))

 insert into @ts
 --Get Account Data
 exec [dbo].APICaller_GET_headers
                            @wurl
                            ,@header

SELECT  *
 FROM OPENJSON((select * from @ts),'$."Items"')  

Вывод enter image description here

Я сейчас пытаюсь записать эти данные в таблицу расширяя приведенный выше оператор выбора с помощью WITH, как показано ниже

SELECT  *
 FROM OPENJSON((select * from @ts),'$."Items"')  
        WITH (   
              Number   varchar(200)   '$.Name',
              Number   varchar(200)   '$.Value'
                ) a

Это вывод JSON

[{"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]"}]

Но он не работает и продолжает получать значение null. Есть идеи?

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Я могу воспроизвести проблему из вопроса с помощью следующего контрольного примера.

Таблица и 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
0 голосов
/ 25 марта 2020
declare @j nvarchar(max) = 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]"}]}';
declare @ts table(Json_Table nvarchar(max));
insert into @ts(Json_Table) values(@j);


select nv.*
from openjson(@j)
with (Items nvarchar(max) as json) as i --Items is array..
cross apply openjson(i.Items) --...cross apply to get each object in the array
with (Name nvarchar(200), Value nvarchar(200)) as nv;

select nv.*
from @ts as ts
cross apply openjson(ts.Json_Table, '$.Items') 
with (Items nvarchar(max) '$' as json) as i
cross apply openjson(i.Items)
with (Name nvarchar(200), Value nvarchar(200)) as nv;

select nv.*
from @ts as ts
cross apply openjson(ts.Json_Table) 
with (Items nvarchar(max) as json) as i
cross apply openjson(i.Items)
with (Name nvarchar(200), Value nvarchar(200)) as nv;

select nv.*
from @ts as ts
cross apply openjson(ts.Json_Table) 
with (Items nvarchar(max) '$.Items' as json) as i
cross apply openjson(i.Items)
with (Name nvarchar(200), Value nvarchar(200)) as nv;


select nv.*
from @ts as ts
cross apply openjson(ts.Json_Table, '$.Items') as i
cross apply openjson(i.value)
with (Name nvarchar(200), Value nvarchar(200)) as nv;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...