如何在SQL存储过程中整合Skills表数据生成指定结构结果
整合Skills表数据到存储过程并生成目标JSON格式
嘿,我懂你想要生成包含嵌套技能数组的JSON数据对吧?咱们可以通过调整SQL查询,结合FOR JSON语法来实现你要的结构。首先得纠正下你示例JSON里的小问题——同一个对象里不能有重复的SkillDesc键,正确的格式应该是把Skills做成一个数组,比如"Skills": [{"SkillDesc": "iOS"}, {"SkillDesc": "Android"}]。
假设你的Skills表包含UserID(关联用户表的主键)和SkillDesc(技能描述)这两个核心字段,下面是调整后的存储过程查询语句:
SELECT users.UserID, users.UserName, users.Password, -- 注意:实际生产环境不要返回明文密码,这是严重的安全风险! users.Email_ID, users.UserProfileImageURL, -- 子查询获取当前用户的所有技能,生成JSON数组 ( SELECT SkillDesc FROM Skills WHERE UserID = users.UserID FOR JSON PATH ) AS Skills, profiles.Details, profiles.Experiance, profiles.HoursCompleated, profiles.RatePerHour, profiles.SubTitle, profiles.TotalEarning FROM Users users LEFT JOIN profile profiles ON users.UserID = profiles.UserID WHERE users.UserType = 'Coach' AND users.UserID = 1 -- 生成最终的单个JSON对象,而非数组;保留空值字段 FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER;
关键部分解释:
- 子查询生成Skills数组:通过嵌套的
SELECT ... FOR JSON PATH,把当前用户的所有技能转换成一个JSON数组,直接映射到结果的Skills字段中。 WITHOUT_ARRAY_WRAPPER:因为你查询的是单个用户(UserID=1),用这个选项可以让结果返回单个JSON对象,而不是包裹在数组里。INCLUDE_NULL_VALUES:确保如果用户没有任何技能,Skills字段会显示为[](空数组)而不是被省略。
如果你的Skills表结构和我假设的不一样(比如有其他字段需要返回),只需要调整子查询里的字段即可。另外再强调下,返回明文密码是非常不安全的做法,建议在实际场景中移除这个字段或者做加密处理。
内容的提问来源于stack exchange,提问作者Amandeep Singh
相关产品推荐
相关产品推荐

