SQL Server 2012 GROUP BY报错Msg 8120,需实现多数据库逗号分隔显示
解决SQL Server 2012中Msg 8120错误及实现数据库名称逗号分隔需求
错误原因
Msg 8120, Level 16, State 1, Line 43
Column '#servers.ServerId' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
这个错误是因为子查询中引用的S.ServerId既未被包含在外层GROUP BY子句中,也未被聚合函数包裹。更关键的是,你的场景完全不需要使用GROUP BY:从表结构来看,每个ApplicationId对应唯一的ServerId,关联#servers后,ApplicationId与ServerName的组合本身就是唯一的,分组操作属于多余,反而触发了字段不匹配的错误。
修正后的代码
SELECT p.ApplicationId, S.ServerName, [DataBase] = STUFF((SELECT DISTINCT ',' + pt.DatabaseName FROM #Database pt WHERE S.ServerId = pt.ServerId FOR XML PATH(''), TYPE).value(N'./text()[1]', N'nvarchar(max)'), 1, 1, N'') FROM #application p INNER JOIN #servers S ON S.ServerId = P.ServerId ORDER BY p.ApplicationId, S.ServerName
关键修改点
- 移除多余的
GROUP BY子句:#application与#servers是一对一关联,查询结果天然每行对应一个应用和服务器,无需分组。 - 修正
STUFF函数参数:原代码中STUFF第三个参数为2,会错误删除前两个字符(逗号+数据库名首字母),改为1即可只删除开头的逗号。
测试结果
执行修正后的代码,将得到你期望的结果:
| ApplicationId | ServerName | DataBase |
|---|---|---|
| 1 | LinuxServer | DB1,DB2 |
| 2 | WindowsServer | DB3,DB4 |
扩展说明
如果后续表结构变更(比如一个应用对应多个服务器)需要分组,可将S.ServerId加入GROUP BY子句,确保所有非聚合字段都在分组列表中:
SELECT p.ApplicationId, S.ServerName, [DataBase] = STUFF((SELECT DISTINCT ',' + pt.DatabaseName FROM #Database pt WHERE S.ServerId = pt.ServerId FOR XML PATH(''), TYPE).value(N'./text()[1]', N'nvarchar(max)'), 1, 1, N'') FROM #application p INNER JOIN #servers S ON S.ServerId = P.ServerId GROUP BY p.ApplicationId, S.ServerName, S.ServerId ORDER BY p.ApplicationId, S.ServerName
内容的提问来源于stack exchange,提问作者ahmed abdelaziz
相关产品推荐
相关产品推荐

