Как создать отдельный объект JSON массив в SQL? - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь преобразовать строку данных в массив JSON, содержащий один объект. Один столбец содержит XML, в котором описывается еще один отдельный объект, преобразованный в массив.

Мой запрос:

WITH r AS (
SELECT TOP 1 * FROM Table1
ORDER BY RecordID ASC)

SELECT 
NEWID() AS 'Report.ReportUUID', 
Value1 as 'Report.Value1', 
Value2 as 'Report.Value2',
DateTime as 'Report.DateTime',
UserID as 'Report.UserID',
'Medium' as 'Report.Priority',
NEWID() as 'Report.Item.ItemUUID',
XML.value('category[1]', 'varchar(100)') as 'Report.Item.Category',
XML.value('description[1]', 'varchar(1000)') as 'Report.Item.Description',
XML.value('date[1]', 'varchar(100)') AS 'Report.Item.DateTime'
FROM r
FOR JSON PATH, ROOT('DataSet');

Желаемый результат:

{
  "DataSet" : {
    "Report" : [
      {
        "ReportUUID" : "uuid here",
        "Value1" : "value1",
        "Value2" : "value2",
        "DateTime" : "2020-04-06 16:00:00",
        "UserID" : "1234",
        "Priority" : "Medium",
        "Item" : [
          {
            "ItemUUID" : "uuid here",
            "Category" : "01",
            "Description" : "Desc",
            "DateTime" : "2020-04-05 08:00:00"
          }
        ]
      }
    ]
  }
}

Факт. output:

{
    "DataSet": [
        {
            "Report": {
                "ReportUUID" : "uuid here",
                "Value1": "value1",
                "Value2": "value2",
                "DateTime": "2020-04-06 16:00:00",
                "UserID": "1234",
                "Priority": "Medium",
                "Item": {
                    "ItemUUID": "uuid here",
                    "Category": "01",
                    "Description": "Desc",
                    "DateTime": "2020-04-05 08:00:00"
                }
            }
        }
    ]
}

DataSet должен быть одним объектом, а Report и Item должны быть массивами, содержащими один объект. Может кто-нибудь помочь с форматированием данных, как это?

1 Ответ

2 голосов
/ 06 апреля 2020

Вам нужно утверждение, подобное следующему:

;WITH r AS (
   SELECT TOP 1 * FROM Table1
   ORDER BY RecordID ASC
)
SELECT Report AS 'DataSet.Report'
FROM (
   SELECT 
      NEWID() AS 'ReportUUID', 
      Value1 as 'Value1', 
      Value2 as 'Value2',
      DateTime as 'DateTime',
      UserID as 'UserID',
      'Medium' as 'Priority',
      (
      SELECT 
         NEWID() as 'ItemUUID',
         XML.value('category[1]', 'varchar(100)') as 'Category',
         XML.value('description[1]', 'varchar(1000)') as 'Description',
         XML.value('date[1]', 'varchar(100)') AS 'DateTime'
      FOR JSON PATH   
      ) AS 'Item'
   FROM r
   FOR JSON AUTO
) t (Report)
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...