Использование вложенных запросов для создания файла JSON

#json #sql-server #subquery #for-json

#json #sql-сервер #вложенный запрос #для-json

Вопрос:

Я пытаюсь создать файл JSON для нового проекта, который я в настоящее время изучаю. Большая часть из них работает так, как ожидалось, но сейчас я нахожусь в точке, где я пытаюсь использовать вложенные запросы для правильного форматирования JSON.

Я пытался использовать следующий вложенный запрос, но SQL не нравится форматирование.

` ВЫБЕРИТЕ

 'Admin User TEST ONLY PLEASE IGNORE' AS AdditionalNotes


(
   SELECT v.atFault 
   FROM dbo.ic_DP_AX ax
   CROSS APPLY (VALUES (ax.Acc_fault1), (ax.Acc_fault2)) v (atFault)
   FOR JSON AUTO
   ) AS InsuredPartyClaims,
   (
   SELECT Acc_fault3 AS atFault 
   FROM dbo.ic_DP_AX
   FOR JSON AUTO
   ) AS InsuredPartyConvictions
FOR JSON PATH) ROOT('InsuredParties')



FROM

    dbo.icp_Daprospect AS p INNER JOIN
    dbo.icp_Dapolicy AS d ON p.Branch@ = d.Branch@ AND p.ClientRef@ = 
 d.ClientRef@ LEFT OUTER JOIN
    dbo.ic_DP_AX AS  ax ON P.Branch@ = ax.B@ AND ax.PolRef@ = d.PolicyRef@ 
LEFT OUTER JOIN
WHERE 
    d.PolicyRef@ = '' AND
    d.Branch@ = 0`
  

ДЛЯ ПУТИ JSON

Результат, которого я пытаюсь достичь,:

 "InsuredParties": [
    {
        "InsuredPartyClaims": [
            {
                "atFault": false
            },
            {
                "atFault": true
            }
        ],
        "InsuredPartyConvictions": [ 
           {
                "atFault": false
           },
           
  

Кто-нибудь может увидеть, что я делаю не так? Я пытаюсь сделать это как можно более простым.

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

1. Привет, Эндрю! На первый взгляд, я думаю, вам нужен оператор SELECT после ПЕРЕКРЕСТНОГО ПРИМЕНЕНИЯ. ВЫБЕРИТЕ x ИЗ ПЕРЕКРЕСТНОГО ПРИМЕНЕНИЯ y (ВЫБЕРИТЕ x ИЗ z, ГДЕ ID = ID) как A. По сути, вы выполняете внутреннее соединение, поэтому вам нужен оператор SELECT в ПЕРЕКРЕСТНОМ ПРИМЕНЕНИИ. Не уверен, поможет ли это, но некоторые ссылки на ПЕРЕКРЕСТНЫЕ ПРИМЕНЯЮТСЯ mssqltips.com/sqlservertip/1958 /…

Ответ №1:

Это всегда сложно без образцов данных, но пример foolowing является возможным решением:

Таблица:

 CREATE TABLE dbo.ic_DP_AX (Acc_fault1 bit, Acc_fault2 bit, Acc_fault3 bit)
INSERT INTO dbo.ic_DP_AX (Acc_fault1, Acc_fault2, Acc_fault3)
VALUES (0, 1, 0)
  

Statment:

 SELECT
   (
   SELECT v.atFault 
   FROM dbo.ic_DP_AX ax
   CROSS APPLY (VALUES (ax.Acc_fault1), (ax.Acc_fault2)) v (atFault)
   FOR JSON AUTO
   ) AS InsuredPartyClaims,
   (
   SELECT Acc_fault3 AS atFault 
   FROM dbo.ic_DP_AX
   FOR JSON AUTO
   ) AS InsuredPartyConvictions
FOR JSON PATH, ROOT('InsuredParties')   
  

Результат:

 {
  "InsuredParties":[
    {
      "InsuredPartyClaims":[
        {
          "atFault":false
        },
        {
          "atFault":true
        }
      ],
      "InsuredPartyConvictions":[
        {
          "atFault":false
        }
      ]
    }
  ]
}
  

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

1. к сожалению, я также получаю синтаксическую ошибку в двух операторах FOR JSON AUTO

2. @AndrewBarnard Утверждение из ответа является рабочим примером. Если возможно, опубликуйте свою попытку.

3. Я только что внес изменения в свой исходный пост, чтобы включить полный запрос

Ответ №2:

Вложенные запросы также должны возвращать JSON.

Попробуйте

 (
  (SELECT ax.Acc_fault1 AS [atFault] FROM dbo.ic_DP_AX AS ax FOR JSON PATH) AS [PartyClaims]
  (SELECT ax.Acc_fault2 AS [atFault] FROM dbo.ic_DP_AX AS ax FOR JSON PATH) AS [PartyClaims]
  (SELECT ax.Acc_fault3 AS [atFault] FROM dbo.ic_DP_AX AS ax FOR JSON PATH) AS [PartyConvictions]
) FOR JSON PATH AS [InsuredParties]
  

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

1. К сожалению, когда я пытаюсь использовать это, отображается синтаксическая ошибка.