2017-08-08 41 views
1

我有一個生產數據庫DataProd與表IPSubnets。該表僅由兩列組成:ID(此處未使用)和子網地址(IP_Subnets0)。產生消息8120,級別16的東西函數

現在,我想將每個IP_Subnets0條目與它所在物理站點的名稱關聯起來。由於單個站點可以有多個子網,因此我還希望按照Site關聯的子網列表將結果分組。

我做什麼,到目前爲止是這樣的:

  • 我已經開始用站點列表表的聲明,因爲我不能創建新的永久表到我的數據庫。您可以注意到Site3有兩個關聯的子網。
  • 然後,我從@SiteList中選擇SiteName並使用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 

當我這樣做,我得到一個錯誤

消息8120,級別16 '@ SiteList.Subnet' 是在選擇列表中,因爲它無效不包含在聚合函數或GROUP BY子句中

上線在STUFF內部的子句。

我不明白是什麼問題。我已經使用這個Stuff部分類似(雖然不是像在這裏聲明的表,而是用數據庫中的實際表格),並且一切都很順利。

有什麼想法?

回答

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 
+0

啊是啊,是我不好。我想知道我是怎麼結束的,我在這裏做了某種聚合。你會建議如何獲得我想要的結果(每個站點一行,每個關聯的子網連在一個列中)? – Tuttu

+0

你需要調整where子句來看看sitename而不是子網 - 我會在一秒內更新答案 – Eli

+0

@Tuttu我更新了查詢 - 讓我知道它是否適合你。 – Eli