You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修改点

  1. 移除多余的GROUP BY子句:#application与#servers是一对一关联,查询结果天然每行对应一个应用和服务器,无需分组。
  2. 修正STUFF函数参数:原代码中STUFF第三个参数为2,会错误删除前两个字符(逗号+数据库名首字母),改为1即可只删除开头的逗号。

测试结果

执行修正后的代码,将得到你期望的结果:

ApplicationIdServerNameDataBase
1LinuxServerDB1,DB2
2WindowsServerDB3,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:18:18