SQL Server中如何将FOR JSON PATH生成的JSON结果作为字符串返回
SQL Server 生成带外层引号包裹的JSON字符串方案
问题复现
测试用表结构与初始代码:
DECLARE @T TABLE ([value] NVARCHAR(MAX)) INSERT INTO @T ([value]) VALUES ('foo') INSERT INTO @T ([value]) VALUES ('bar') SELECT [value] FROM @T FOR JSON PATH
- 直接执行默认返回结果:
[{"value":"foo"},{"value":"bar"}] - 目标返回格式:整体被双引号包裹的字符串形式,示例为
"[{'SS':'foo'},{'SS':'bar'}]"
实现方案
方案1:变量接收后手动拼接(适配任意场景)
将FOR JSON PATH生成的结果存入变量,按需替换内部引号后在外层包裹双引号即可,可直接匹配目标格式:
DECLARE @T TABLE ([value] NVARCHAR(MAX)) DECLARE @jsonResult NVARCHAR(MAX) INSERT INTO @T ([value]) VALUES ('foo') INSERT INTO @T ([value]) VALUES ('bar') -- 生成JSON时给列起别名匹配示例中的SS键名 SELECT @jsonResult = ( SELECT [value] AS SS FROM @T FOR JSON PATH ) -- 外层包裹双引号,按需将内部双引号替换为单引号 SELECT '"' + REPLACE(@jsonResult, '"', '''') + '"' AS WrappedResult
执行后返回结果完全匹配目标格式:
"[{'SS':'foo'},{'SS':'bar'}]"
如果需要输出符合RFC标准的JSON字符串,去掉REPLACE逻辑直接拼接外层引号即可,返回的"[{""SS"":""foo""},{""SS"":""bar""}]"可被所有标准JSON解析器正常识别。
方案2:JSON函数自动转义(适配嵌套JSON场景)
如果需要将该字符串作为其他JSON结构的属性值,可使用JSON_QUERY配合FOR JSON自动完成转义包裹,无需手动处理引号:
DECLARE @T TABLE ([value] NVARCHAR(MAX)) INSERT INTO @T ([value]) VALUES ('foo') INSERT INTO @T ([value]) VALUES ('bar') SELECT JsonStrCol = JSON_QUERY((SELECT [value] AS SS FROM @T FOR JSON PATH)) FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
提示:标准JSON规范要求字符串边界、内部键/值的引号必须为双引号,将内部引号替换为单引号的写法无法被通用JSON解析器识别,仅在有特殊业务对接要求时使用。
内容的提问来源于stack exchange,提问作者JB's
相关产品推荐
相关产品推荐

