在SQL Server中将查询输出转换为JSON格式

时间:2018-10-26 12:29:55

标签: json sql-server

我想将以下查询输出显示为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]}]

3 个答案:

答案 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

看看这个:Format Query Results as JSON with FOR JSON

答案 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")