如何将SQL两列查询结果转换为单键值对JSON对象
解决方案:将两列SQL结果转为单个JSON对象
要实现把FormField列作为键、Value列作为对应值,生成单个JSON对象的需求,你可以根据场景选择以下几种方法:
方法1:字符串拼接(简单场景,无特殊字符)
如果你的FormField和Value中不包含引号、反斜杠等JSON特殊字符,直接用STRING_AGG拼接键值对,再包裹成JSON结构即可:
SELECT '{' + STRING_AGG('"' + FormField + '": "' + Value + '"', ',') + '}' AS SingleJSON FROM FormsData
方法2:带特殊字符转义的字符串拼接
如果字段值里存在双引号、反斜杠这类特殊字符,必须用STRING_ESCAPE处理后再拼接,避免生成无效JSON:
SELECT '{' + STRING_AGG( '"' + STRING_ESCAPE(FormField, 'json') + '": "' + STRING_ESCAPE(Value, 'json') + '"', ',' ) + '}' AS SingleJSON FROM FormsData
方法3:动态SQL + PIVOT(适用于动态字段)
如果FormField的取值是动态不固定的,推荐用动态SQL结合PIVOT先将行转成列,再生成单个JSON对象:
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX) -- 收集所有FormField值作为列名 SELECT @columns = STRING_AGG('[' + FormField + ']', ',') FROM FormsData -- 构造动态SQL,行转列后生成JSON SET @sql = N' SELECT ' + @columns + ' FROM FormsData PIVOT ( MAX(Value) FOR FormField IN (' + @columns + ') ) AS PivotedData FOR JSON PATH, WITHOUT_ARRAY_WRAPPER ' EXEC sp_executesql @sql
为什么你原来的语句不行?
你之前的SELECT FormField, Value FROM FormsData FOR JSON PATH会把每一行数据转换成一个独立的JSON对象(比如{"FormField":"Name","Value":"Jhon"}),然后自动包裹成数组。加上WITHOUT_ARRAY_WRAPPER也只是去掉数组外层的[],得到的是多个对象的拼接(而非单个合并对象),所以不符合需求。
内容的提问来源于stack exchange,提问作者Steve Rodriguez
相关产品推荐
相关产品推荐

