2010-09-03 95 views
3

我正在嘗試使用'For Xml路徑'T-SQL從列中生成一個以逗號分隔的值列表。這似乎工作得很好,但問題是我想獲得在逗號分隔列表中的項目的計數。這裏是我用來生成逗號的代碼示例分隔列表:Sql For Xml路徑獲取節點數

Create Table #List ([col] varchar) 

Insert Into #List Select '1'; 
Insert Into #List Select '2'; 
Insert Into #List Select '3' 

Select ',' + [col] From #List For Xml Path('') 

這使結果1,2,3不如預期,但沒有辦法讓計,有3個項目。任何添加計數的嘗試都會將它添加到xml中。我結合這個代碼的CTE得到計數:

With CTE As (
    Select 
     [col] 
    From 
     #List 
) 
Select 
    (Select ',' + [col] From #List For Xml Path('')) As [List], 
    Count(*) As [Count] 
From 
    CTE 

有沒有更簡單/清潔的方式來獲得節點的計數,不使用CTE?有人指出,你可以在內部select和outside之外複製from子句,但這需要保持from子句同步。我想獲得列表和計數,但只有一次寫入from子句。

回答

2

如何從CTE而不是臨時表繪圖數據?

With CTE As (
    Select 
     [col] 
    From 
     #List 
    -- Many joins 
    -- Complicated where clause 
) 
Select 
    (Select ',' + [col] From Cte For Xml Path('')) As [List], 
    Count(*) As [Count] 
From 
    CTE 

這將允許你保持你的連接和搜索謂詞在一個地方。

+0

這實際上是我最終使用的。但是,我最終不得不在使用CTE之前將複雜的選擇放入臨時表中。當我直接加入CTE時,表現非常糟糕。 CTE中的查詢返回大約需要2秒,但是,它會將整個查詢與逗號列表累積小時數結合起來。花了這麼長時間,我從來沒有讓它完成。如果我首先將複雜選擇放入臨時表中,則查詢需要一秒鐘才能運行。我唯一能想到的是,CTE中的選擇正在爲每次迭代重新運行? – user355930 2010-09-08 16:41:26

1

你不需要的CTE可以使用子查詢的方式直接

SELECT 
     COUNT(*) AS [Count], 
     (SELECT ',' + [col] FROM #List FOR XML PATH('')) AS [List] 
FROM #List 
+0

這是一個可以接受的解決方案,但問題是它需要將from邏輯重複兩次。如果我從一個有10個連接的語句中抽出,我將不得不重複在子語句和from子句中的連接。我希望能夠編寫一次連接邏輯並獲取逗號列表和計數。我會修改我的問題。我試圖給你投票,但我沒有足夠的代表。 – user355930 2010-09-03 19:04:03