填充函数导致消息8120,级别16

时间:2017-08-08 13:31:08

标签: sql-server sql-server-2008

我有一个带有表DataProd的生产数据库IPSubnets。此表仅由两列组成: ID (此处未使用)和子网地址(IP_Subnets0)。

现在,我想将每个IP_Subnets0条目与其所在的物理站点的名称相关联。由于单个站点可以有多个子网,我还希望按站点对结果进行分组,并附带关联子网的连接列表。

到目前为止我所做的是以下内容:

  • 我已经开始声明 SiteList 表,因为我无法在我的数据库中创建新的永久表。您可以注意到 Site3 有两个关联的子网。
  • 然后,我从SiteName中选择了@SiteList,并使用Stuff表现得像Group_Concat那样IP_Subnets0
  • 最后,我做了Group By SiteName

代码:

DECLARE @SiteList TABLE (SiteID Int Not Null Primary Key Identity(1,1), 
                         SiteName VarChar(30), 
                         Subnet VarChar(15)
                        )

INSERT INTO @SiteList 
VALUES ('Site1', '192.168.10.0'), ('Site2', '192.168.20.0'),
       ('Site3', '192.168.30.0'), ('Site3', '192.168.40.0')

SELECT DISTINCT
    SL.SiteName, 
    Subnets = STUFF((SELECT DISTINCT ','+ IP_Subnets0 
                     FROM dbo.v_RA_System_IPSubnets
                     WHERE IP_Subnets0 = SL.Subnet
                     FOR XML PATH('')), 1, 1, '')
FROM
    @SiteList SL
GROUP BY
    SL.SiteName

当我这样做时,我收到错误

  

Msg 8120,等级16   ' @ SiteList.Subnet'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句

位于WHERE内的STUFF子句行。

我不明白问题所在。我已经类似地使用过这个Stuff部分了(虽然没有像我在这里声明的那样表,而是使用数据库中的实际表),一切都很顺利。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您未在此处汇总任何数据 - 运行您的查询,没有最后一行 - 即删除GROUP BY语句。

更新了查询

DECLARE @SiteList TABLE (SiteID Int Not Null Primary Key Identity(1,1), 
                         SiteName VarChar(30), 
                         Subnet VarChar(15)
                        )

INSERT INTO @SiteList 
VALUES ('Site1', '192.168.10.0'), ('Site2', '192.168.20.0'),
       ('Site3', '192.168.30.0'), ('Site3', '192.168.40.0')

SELECT DISTINCT
    SL.SiteName, 
    Subnets = STUFF((SELECT DISTINCT ','+ IP_Subnets0 
                     FROM dbo.v_RA_System_IPSubnets
                     --WHERE IP_Subnets0 = SL.Subnet  -- your where clause
                     WHERE SiteName = SL.SiteName     -- you want to match on sitename         
                     FOR XML PATH('')), 1, 1, '')
FROM
    @SiteList SL