Sql server 填充函数生成Msg 8120,16级

Sql server 填充函数生成Msg 8120,16级,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一个生产数据库DataProd,带有一个表IPSubnets。此表仅由两列组成:ID(此处未使用)和子网地址(IP_Subnets0) 现在,我想将每个IP_子网0条目与它所在的物理站点的名称相关联。由于单个站点可以有多个子网,因此我还希望使用关联子网的串联列表按站点对结果进行分组 到目前为止,我所做的工作如下: 我首先声明了一个站点列表表,因为我无法在数据库中创建新的永久表。您可以注意到Site3有两个子网 然后,我从@SiteList中选择SiteName,并使用Stuff像Group

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

现在,我想将每个IP_子网0条目与它所在的物理站点的名称相关联。由于单个站点可以有多个子网,因此我还希望使用关联子网的串联列表按站点对结果进行分组

到目前为止,我所做的工作如下:

  • 我首先声明了一个站点列表表,因为我无法在数据库中创建新的永久表。您可以注意到Site3有两个子网
  • 然后,我从
    @SiteList
    中选择
    SiteName
    ,并使用
    Stuff
    Group\u Concat
    一样在
    IP\u子网0上运行
  • 最后,我按SiteName进行分组
代码:

当我这样做时,我会得到一个错误

味精8120,16级 “@SiteList.Subnet”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中

STUFF
中的
WHERE
子句的行上

我不明白问题出在哪里。我已经使用了类似的
东西
片段(虽然不是像这里那样声明表,而是数据库中的实际表),一切都进行得很顺利


有什么想法吗?

您没有在这里聚合任何数据-按您的方式运行查询,而不是最后一行-即删除
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

啊,是的,我的错。我不知道我怎么会认为我在这里做某种聚合。您建议如何获得我想要的结果(每个站点一行。每个关联的子网连接在一列中)?您需要调整where子句以查看站点名称而不是子网-我将在sec@Tuttu我更新了查询-让我知道它是否适合你。谢谢你的回答。几分钟后我自己弄明白了,但后来我在一个会议上被抓住了,无法在这里发布。谢谢您的时间。:)好的,如果有帮助的话,请考虑投票和/或标记它作为答案。
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