SQL Server如何将GROUP BY分组值作为JSON键生成自定义JSON
实现方法
SQL Server 原生FOR JSON语法不支持直接将查询返回的字段值作为动态JSON键名,你需要先按schema分组聚合出每个schema对应的依赖对象数组,再二次拼接成键为schema名的JSON对象。
另外你给出的期望输出存在JSON语法错误:键值对结构的外层必须用{}(JSON对象)包裹,不能用[](JSON数组,仅支持数字索引),修正后可生成完全符合预期的合法JSON。
可直接运行的代码
-- 先按schema分组聚合每个schema下的依赖对象 WITH schema_dependency AS ( SELECT referencing_schema_name, -- 构造每个schema对应的对象数组,保留转义逻辑避免特殊字符导致JSON无效 object_list = JSON_QUERY('["' + STRING_AGG(STRING_ESCAPE(referencing_entity_name, 'json'), '","') + '"]') FROM sys.dm_sql_referencing_entities('dbo.C_Table', 'OBJECT') re GROUP BY referencing_schema_name ) -- 二次拼接为schema名作为键的JSON对象 SELECT CONCAT( '{', STRING_AGG( CONCAT('"', STRING_ESCAPE(referencing_schema_name, 'json'), '":', object_list), ',' ), '}' ) AS table_dependency_map FROM schema_dependency FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;
输出结果
运行后返回的合法JSON结构如下,完全符合你要的简洁结构:
{ "dbo": [ "C_Table" ], "bcd": [ "get_AmazingDataById", "get_EvenMoreAmazingDataById" ] }
关于STRING_AGG方案的补充说明
- 在SQL Server 2017、Azure SQL及以上版本中,
STRING_AGG是实现这类字符串聚合性能最优、写法最简洁的原生方案,不需要使用老旧的FOR XML PATH拼接方式(该方式性能更差,还需要额外处理XML特殊字符转义)。 - 你原有写法中用
STRING_ESCAPE处理对象名的JSON转义是非常规范的写法,可以避免对象名包含引号、换行符等特殊字符时生成非法JSON,建议保留。
内容的提问来源于stack exchange,提问作者Dalton
相关产品推荐
相关产品推荐

