Конвертировать JSON в таблицу, используя T-SQL - PullRequest
0 голосов
/ 23 сентября 2019

Вот вход JSON

{
   "agentID":"WJ",
   "recordType":"AHL",
   "recordReference":{
      "stationCode":"ATL",
      "airlineCode":"XS",
      "recordId":"10001"
   },
   "entries":[
      {
         "bag":{
            "bagType":"22",
            "bagSize":"S",
            "category":"1"
         },
         "seqNo":"1",
         "noOfBagsGiven":"2"
      },
      {
         "bag":{
            "bagType":"23",
            "bagSize":"L",
            "category":"1"
         },
         "seqNo":"2",
         "noOfBagsGiven":"5",
         "dateBagsGiven":"2019-09-18"
      }
   ]
}

А вот выход, который я надеюсь получить (табличный или ограниченный) enter image description here

Iне знаю как перебрать дочерние записи и вот что у меня пока что

DECLARE @JSON    VARCHAR(MAX) =
'{
   "agentID":"WJ",
   "recordType":"AHL",
   "recordReference":{
      "stationCode":"ATL",
      "airlineCode":"XS",
      "recordId":"10001"
   },
   "entries":[
      {
         "bag":{
            "bagType":"22",
            "bagSize":"S",
            "category":"1"
         },
         "seqNo":"1",
         "noOfBagsGiven":"2"
      },
      {
         "bag":{
            "bagType":"23",
            "bagSize":"L",
            "category":"1"
         },
         "seqNo":"2",
         "noOfBagsGiven":"5",
         "dateBagsGiven":"2019-09-18"
      }
   ]
}';

SELECT *
FROM   OPENJSON(@json) WITH(agent_id        VARCHAR(2)  '$.agentID'
                           ,record_type     VARCHAR(4)  '$.recordType'
                           ,station_code    VARCHAR(4)  '$.recordReference.stationCode'
                           ,airline_code    VARCHAR(4)  '$.recordReference.airlineCode'
                           ,record_id       INT         '$.recordReference.recordId'
                           ,bag_type        INT         '$.entries.bag.bagType'
                           ,bag_size        VARCHAR(2)  '$.entries.bag.bagSize'
                           ,bag_category    INT         '$.entries.bag.bagCategory'
                           ,date_bags_given DATE        '$.entries.bag.dateBagsGiven'
                           );

Ответы [ 2 ]

3 голосов
/ 23 сентября 2019

Используйте комбинацию AS JSON и CROSS APPLY:

SELECT  agent_id
       ,record_type
       ,station_code
       ,airline_code
       ,record_id
       ,bag_size
       ,bag_category
       ,date_bags_given
FROM OPENJSON(@json) WITH(
      agent_id        VARCHAR(2)    '$.agentID'
     ,record_type     VARCHAR(4)    '$.recordType'
     ,station_code    VARCHAR(4)    '$.recordReference.stationCode'
     ,airline_code    VARCHAR(4)    '$.recordReference.airlineCode'
     ,record_id       INT           '$.recordReference.recordId'
     ,entries         NVARCHAR(MAX) '$.entries' AS JSON
     )

CROSS APPLY OPENJSON(entries) WITH (
     bag_size        VARCHAR(2)     '$.bag.bagSize'
    ,bag_category    INT            '$.bag.Category'
    ,date_bags_given DATE           '$.dateBagsGiven'
);

Подробнее см. Решение распространенных проблем с JSON вПараграф ввода SQL Server, OPENJSON и JSON.

2 голосов
/ 23 сентября 2019

Другой возможный подход - использовать JSON_VALUE() (для извлечения скалярного значения из строки JSON) и OPENJSON() (для анализа строки JSON и получения результатов в виде таблицы):

SELECT JSON_VALUE(@JSON,'$.agentID') AS                     agentID
      ,JSON_VALUE(@JSON,'$.recordType') AS                   recordType
      ,JSON_VALUE(@JSON,'$.recordReference.stationCode') AS stationCode
      ,JSON_VALUE(@JSON,'$.recordReference.airlineCode') AS airlineCode
      ,JSON_VALUE(@JSON,'$.recordReference.recordId') AS    recordId
      ,j.*
FROM   OPENJSON(@JSON
               ,'$.entries') WITH(bagType VARCHAR(10) '$.bag.bagType'
                                 ,bagSize VARCHAR(10) '$.bag.bagSize'
                                 ,category VARCHAR(10) '$.bag.category'
                                 ,seqNo VARCHAR(10) '$.seqNo'
                                 ,noOfBagsGiven VARCHAR(10) '$.noOfBagsGiven'
                                 ,dateBagsGiven VARCHAR(10) '$.dateBagsGiven') AS j;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...