我想将SELECT语句的结果作为JSON对象输出。
id name active Status
1 Bob Jones 1 Active
2 John Smith 0 Inactive
我需要这样的返回结果:
{"Active":[{"id":1,"name":"Bob Jones","active":1}],"InActive":[{"id":1,"name":"John Smith","active":0}]}
如何使用查询?
我正在使用此代码
DECLARE @JSONTierDetails AS TABLE (TierDetails VARCHAR(8000))
INSERT INTO @JSONTierDetails
SELECT
(SELECT id, name, active
FROM MyTable
WHERE Status = 'Active'
FOR JSON PATH, INCLUDE_NULL_VALUES) TierDetails
SELECT TierDetails
FROM @JSONTierDetails
提前致谢
答案 0 :(得分:0)
在microsoft站点中查看此页面: JSON Data (SQL Server)
答案 1 :(得分:0)
-- Table definition
DECLARE @data TABLE(id int, [name] nvarchar(128), active bit, [status] nvarchar(30));
-- Insert test rows
INSERT @data VALUES(1, 'Bob Jones', 1, 'Active'), (2, 'John Smith', 0, 'Inactive');
-- Output
SELECT
(SELECT id, name FROM @data WHERE active = 1 FOR JSON PATH) AS [Active],
(SELECT id, name FROM @data WHERE active = 0 FOR JSON PATH) AS [Inactive]
FOR JSON PATH , WITHOUT_ARRAY_WRAPPER;
答案 2 :(得分:0)
您的案例需要数组包装器和每个JSON表达式的属性名称。添加数组包装器并不难,但是属性名称却很难。 , ROOT(<property_name>)
之后的FOR JSON PATH
可以使用,但可以静态方式应用一次。
因此,动态查询可能是首选,例如
DECLARE @JSONTierDetails NVARCHAR(MAX) =
(
SELECT 'SELECT ' +
STUFF((
SELECT N',(SELECT id, name, active
FROM MyTable subT
WHERE subT.status = ''' + status + N'''
FOR JSON PATH
) AS [' + status + N']' + CHAR(13) + ' '
FROM MyTable t
FOR XML PATH(''),TYPE).value('(./text())[1]','NVARCHAR(MAX)'),1,1,'')
+ 'FOR JSON PATH, WITHOUT_ARRAY_WRAPPER' );
EXEC (@JSONTierDetails);