将列值连接成逗号分隔的字符串

时间:2015-12-08 16:36:43

标签: sql-server sql-server-2008 tsql sql-server-2008-r2 sql-server-2012

我有一张如下表所示的表格:

EventProfileID    ParamName       ParamValue
1                 _CommandText    usp_storedproc_1
2                 _CommandText    usp_storedproc_2
2                 _CommandText    usp_storedproc_3
2                 _CommandText    usp_storedproc_100
3                 _CommandText    usp_storedproc_11
3                 _CommandText    usp_storedproc_123

我希望输出的内容如下:

EventProfileID    ParamValue
1                 usp_storedproc_1
2                 usp_storedproc_2, usp_storedproc_3, usp_storedproc_100
3                 usp_storedproc_11, usp_storedproc_123

但是我有些麻烦。如果我选择其中一个事件配置文件ID,我可以使用以下逻辑获得输出:

SELECT LEFT(c.ParamValue, LEN(c.ParamValue) - 1)
FROM (
SELECT a.ParamValue + ', '
FROM DP_EventProfileParams AS a
WHERE a.ParamName = '_CommandText'
and a.EventProfileId = '13311'
FOR XML PATH ('')
) c (paramvalue)

然而,这只是给我一个EventProfileID的输出,我也希望EventProfileID作为输出的一部分。

任何人都可以向我提供正确的方向指示我如何扩展我的代码以包含此代码并允许代码是动态的,以便我可以显示所有EventProfileID'

由于

2 个答案:

答案 0 :(得分:2)

你可以这样做:

|    Adobe                         |    1
|    Adobe Systems                 |    1
|    Adobe Systems Inc             |    1
|    Honeywell                     |    2
|    Honeywell Inc                 |    2
|    Honeywell Inc.                |    2
|    Adobe Systems Incorporated    |    1

您与select distinct a.EventProfileID, stuff((select ','+ ParamValue) from DP_EventProfileParams s where s.EventProfileID = a.EventProfileID for XML path('')),1,1,'') from DP_EventProfileParams a 走在了正确的轨道上。 for XML path功能可以更轻松地实现您的目标。

答案 1 :(得分:0)

原始查询不起作用,因为它使用简单子查询(仅适用于一个特定的ID)

要使其适用于所有ID,您可以在correlated subquery内使用XML + STUFF

  

可以通过执行子查询一次来评估许多查询   将结果值替换为WHERE子句   外部查询。在包含相关子查询的查询中(也是   称为重复子查询,子查询取决于外部   查询其值。 这意味着子查询已执行   反复地,对于可能由外部选择的每一行一次   查询。

SELECT DISTINCT
         EventProfileID,
         [ParamVaues] = 
         STUFF((SELECT ',' + d2.ParamValue
               FROM #DP_EventProfileParams d2
               WHERE d1.EventProfileID = d2.EventProfileID
                 AND d2.ParamName = '_CommandText'
               FOR XML PATH('')), 1, 1, '')
FROM #DP_EventProfileParams d1
ORDER BY EventProfileID;

LiveDemo

我强烈建议您阅读Concatenating Row Values in Transact-SQL