3

我正在尝试使用“For Xml Path”T-SQL 从列中生成逗号分隔的值列表。这似乎工作得很好,但问题是我想计算逗号分隔列表中的项目。这是我用来生成逗号分隔列表的代码示例:

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?有人指出,您可以在内部选择内部和外部复制 from 子句,但这需要保持 from 子句同步。我想同时获得列表和计数,但只写一次 from 子句。

4

2 回答 2

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

这将允许您将连接和搜索谓词保存在一个地方。

于 2010-09-04T00:10:34.770 回答
1

您不需要 CTE,您可以直接使用子查询方法

SELECT 
      COUNT(*) AS [Count], 
      (SELECT ',' + [col] FROM #List FOR XML PATH('')) AS [List]
FROM #List
于 2010-09-03T17:49:58.300 回答