#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. К сожалению, когда я пытаюсь использовать это, отображается синтаксическая ошибка.