在SQL Server 2016中返回带有列名的JSON

时间:2019-01-30 10:41:19

标签: json sql-server sql-server-2016

在SQL Server 2016中结果为空时,我试图获取JSON值。

示例:

select Col1,Col2,Col3 from test where Col1 = 2  

enter image description here

select Col1,Col2,Col3 from test where Col1 = 2 for json auto,include_null_values

然后我没有JSON值。只给出空值。 enter image description here

预期结果:

[{"Col1":"","Col2":"","Col3":""}]

请您帮我一下。

谢谢。

2 个答案:

答案 0 :(得分:0)

如果没有匹配的行,则您的选择查询也将不返回任何行。在这种情况下,您可以使用ISNULL(或COALESCE)并返回一些默认字符串,如您所期望的那样。

select isnull(
    (select Col1,Col2,Col3 from test where Col1 = 2 for json auto,include_null_values) -- Your query as nested select
    , '[{"Col1":"","Col2":"","Col3":""}]' -- This string will be returned if there are no matching rows
)

不幸的是,从查询中获取默认字符串并不容易,因此您必须在此处重复select查询中的列名,但这应该不是大问题。

答案 1 :(得分:0)

这是另一个不必使用以下方式来表达各个列的选项:

sys.dm_exec_describe_first_result_set()

示例dbFiddle

Create Table #YourTable (Col1 int,Col2 int,Col3 int)
Insert Into #YourTable values 
 (1,25,75)
,(3,50,100)

Select coalesce(
                (Select Col1,Col2,Col3 From  #YourTable Where Col1 = 2 For json auto,include_null_values )
                ,
                (Select '[{'+Stuff((Select  Concat(',"',Name,'":""') From sys.dm_exec_describe_first_result_set('Select * from #YourTable',null,null) For XML Path ('')),1,1,'')+'}]' )
              )

返回

[{"Col1":"","Col2":"","Col3":""}]