我有一张如下表所示的表格:
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'
由于
答案 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
强>