我想将以下查询输出显示为JSON格式(必需的输出格式)
select ApplicationID ApplicationID ,Roleid Roles from UserRoles where userid=11 and applicationid is not null
Output
ApplicationID Roles
1 1
1 5
3 5
我想使用SQL Server 2016显示以下格式
Required output Format:
[{"ApplicationID":1,"Roles":[1,5]},{"ApplicationID":3,"Roles":[5]}]
答案 0 :(得分:1)
如果您使用的是SQL Server 2016+,则可以使用FOR JSON
语句
SELECT
ApplicationID ApplicationID,
Roleid Roles
FROM UserRoles
WHERE userid = 11 AND applicationid IS NOT NULL
FOR JSON AUTO
答案 1 :(得分:1)
使用纯 T-SQL-JSON-support 获得的最接近的东西是:
DECLARE @tbl TABLE(ApplicationID INT, Roles INT);
INSERT INTO @tbl VALUES
(1,1)
,(1,5)
,(3,5);
SELECT t.ApplicationID
,Roles.Roles AS Roles
FROM @tbl t
INNER JOIN @tbl Roles ON Roles.ApplicationID=t.ApplicationID
GROUP BY t.ApplicationID,Roles.Roles
FOR JSON AUTO;
结果
[{"ApplicationID":1
,"Roles":[{"Roles":1}
,{"Roles":5}]
}
,{"ApplicationID":3
,"Roles":[{"Roles":5}]}
]
在AUTO
模式下,引擎将“查看”联接并将其打包到对象数组。
遗憾的是,FOR JSON
不支持裸数组([1,2,3]
)。您将总是得到对象数组,例如[{Prop:Val},{Prop:Val},{Prop:Val}]
...
但是您可以通过相关的子查询和一些字符串聚合来解决这个问题(我们需要JSON_QUERY()
来避免在数组周围加引号)
SELECT t.ApplicationID
,JSON_QUERY('[' + STUFF((
SELECT CONCAT(',',Roles)
FROM @tbl t2
WHERE t2.ApplicationID=t.ApplicationID
FOR XML PATH('')
),1,1,'') + ']') AS Roles
FROM @tbl t
GROUP BY t.ApplicationID
FOR JSON PATH;
结果
[{"ApplicationID":1,"Roles":[1,5]}
,{"ApplicationID":3,"Roles":[5]}]
您可以使用STRING_AGG()
(v2017 +)吗?在这种情况下,您可以简化子选择。
答案 2 :(得分:0)
我记得:
select ApplicationID ApplicationID ,Roleid Roles from UserRoles where userid=11 and applicationid is not null
FOR JSON PATH, ROOT("UserRoles")