在SQL Server中使用两个选择查询获取Json输出

时间:2017-05-10 03:57:38

标签: sql-server stored-procedures

我想将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

提前致谢

3 个答案:

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

Demo