【问题标题】:Concatenating Column Values into a Comma-Separated string [duplicate]将列值连接成逗号分隔的字符串 [重复]
【发布时间】:2016-03-13 16:29:08
【问题描述】:

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

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?

谢谢

【问题讨论】:

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


    【解决方案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 走在了正确的轨道上。 STUFF函数让你更容易实现你想要的。

    【讨论】:

      【解决方案2】:

      原始查询不起作用,因为它使用简单的子查询(仅适用于一个特定的 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

      【讨论】:

      • 就像复制品一样。
      猜你喜欢
      • 2012-12-22
      • 2021-10-09
      • 2012-07-06
      • 1970-01-01
      • 2011-11-11
      • 2017-09-29
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      相关资源
      最近更新 更多