SQL Server 2016如何让JSON输出中所有数据值带双引号?
实现SQL Server 2016中FOR JSON输出所有字段值带双引号的需求
当然可以实现!SQL Server的FOR JSON默认会根据字段的原生数据类型生成JSON值——比如int、bit这类数值/布尔类型会直接输出不带引号的原始值,而字符串类型才会加双引号。要让所有字段值都带上双引号,核心思路是把所有字段转换为字符串类型后再导出JSON。
方法一:手动转换单个字段(适合字段少的表)
如果你表的字段不多,可以直接在查询里用CAST或CONVERT把每个字段转成字符串类型,示例如下:
SELECT CAST(Id AS NVARCHAR(MAX)) AS Id, CAST([A Id] AS NVARCHAR(MAX)) AS [A Id], Name -- 字符串类型字段可以直接保留,也可以统一转成NVARCHAR FROM TableA FOR JSON PATH, ROOT('TableA')
执行后你会得到类似这样的JSON结果:
{ "TableA":[ { "Id":"34562", "A Id":"2", "Name":"ZDR" } ] }
方法二:动态SQL自动转换所有字段(适合字段多的表)
如果表的字段很多,手动写每个字段的转换语句太麻烦,可以用动态SQL自动生成转换逻辑,适配SQL Server 2016的写法如下:
DECLARE @cols NVARCHAR(MAX); DECLARE @sql NVARCHAR(MAX); -- 自动拼接所有字段的CAST转换语句(SQL Server 2016无STRING_AGG,用FOR XML PATH拼接) SELECT @cols = STUFF(( SELECT ', CAST(' + QUOTENAME(COLUMN_NAME) + ' AS NVARCHAR(MAX)) AS ' + QUOTENAME(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TableA' -- 替换成你的表名 FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 2, ''); -- 构建完整的JSON导出查询 SET @sql = 'SELECT ' + @cols + ' FROM TableA FOR JSON PATH, ROOT(''TableA'')'; -- 执行动态SQL EXEC sp_executesql @sql;
这个脚本会自动读取TableA的所有字段,给每个字段加上字符串转换逻辑,一次性生成符合要求的JSON输出。
原理说明
当字段被转换为NVARCHAR(MAX)(或其他字符串类型)后,FOR JSON会将其识别为字符串值,自然会给对应的JSON值加上双引号,从而实现所有字段值都带引号的需求。
内容的提问来源于stack exchange,提问作者Sakthignanavel
相关产品推荐
相关产品推荐

