从T-SQL查询将键值对输出为JSON

时间:2019-07-02 12:37:50

标签: json tsql

我有一个应用程序需要提供配置数据作为JSON中的键值对。

我想从表查询中输出键值对的JSON。

该表可以具有不同的命名项和不同的项数量。

ITEMID    REPORTID    NAME         VALUE
----------------------------------------
1         29          caption      Profit by Product
2         29          bgColor      #FFFFFF
3         29          showBorder   0
4         29          showsum      0

SQL

    select .................   FOR JSON PATH

我猜这需要使用PIVOT吗?

期望的JSON

   {"caption":"Profit by Product","bgColor":"#FFFFFF","showBorder":"0","showsum":"0"}

任何人都可以提供的帮助。

2 个答案:

答案 0 :(得分:3)

您可以进行一些字符串汇总(假设不是2017年)

示例

Declare @YourTable Table ([ITEMID] varchar(50),[REPORTID] varchar(50),[NAME] varchar(50),[VALUE] varchar(50))  Insert Into @YourTable Values 
 (1,29,'caption','Profit by Product')
,(2,29,'bgColor','#FFFFFF')
,(3,29,'showBorder','0')
,(4,29,'showsum','0')


Select REPORTID
      ,JSONString =  '{' + Stuff((Select concat(',','"',Name,'":"',value,'"') From @YourTable Where ReportID=A.ReportID For XML Path ('')),1,1,'')  + '}'
 From @YourTable A
 Group by REPORTID

返回

REPORTID    JSONString
29          {"caption":"Profit by Product","bgColor":"#FFFFFF","showBorder":"0","showsum":"0"}

答案 1 :(得分:1)

数据透视查询与FOR JSON PATH一起应生成您期望的JSON输出:

SELECT
    MAX(CASE WHEN NAME = 'caption' THEN VALUE END) AS caption,
    MAX(CASE WHEN NAME = 'bgColor' THEN VALUE END) AS bgColor,
    MAX(CASE WHEN NAME = 'showBorder' THEN VALUE END) AS showBorder,
    MAX(CASE WHEN NAME = 'showsum' THEN VALUE END) AS showsum
FROM yourTable
GROUP BY
    ITEMID
FOR JSON PATH;

enter image description here

Demo

请注意,如果您的表包含多个ITEMID组,则每个项目的输出中将有一个JSON记录。