SQL Server 2008 R2中按指定AttributeID生成逗号分隔输出的方法
Solution for Concatenating Descriptions in SQL Server 2008 R2
没问题,这个需求在SQL Server 2008 R2里完全可以实现。因为这个版本还不支持SQL Server 2017及以上的STRING_AGG函数,所以我们得用经典的FOR XML PATH方法来完成字符串拼接。
实现代码
下面是直接可用的SQL语句,记得把YourTableName替换成你实际的表名:
SELECT EntryID, -- 用STUFF去掉开头多余的逗号和空格 STUFF(( SELECT ', ' + Description FROM YourTableName t2 -- 关联同一个EntryID的记录 WHERE t2.EntryID = t1.EntryID -- 只筛选指定的AttributeID AND t2.AttributeID IN (5, 15, 25) -- 拼接成无标签的XML字符串 FOR XML PATH(''), TYPE -- 把XML转换为普通字符串 ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS ConcatenatedDescriptions FROM YourTableName t1 WHERE t1.AttributeID IN (5, 15, 25) -- 按EntryID分组,确保每个EntryID只返回一行 GROUP BY EntryID;
代码解释
FOR XML PATH(''):将子查询中每个符合条件的Description拼接成一段无XML标签的字符串,比如会生成, Red, Large, Cotton这样的内容。TYPE:确保特殊字符(比如&、<)被正确转义,避免出现XML实体编码问题。.value('.', 'NVARCHAR(MAX)'):把XML格式的结果转换为普通的字符串类型。STUFF:从字符串的第1位开始,删除前2个字符(也就是开头的,),得到干净的拼接结果。
测试示例
假设你的表有以下数据:
| EntryID | AttributeID | Description |
|---|---|---|
| 1 | 5 | Red |
| 1 | 15 | Large |
| 1 | 25 | Cotton |
| 1 | 35 | Ignore |
| 2 | 5 | Blue |
| 2 | 25 | Polyester |
运行上述SQL后,会得到这样的结果:
| EntryID | ConcatenatedDescriptions |
|---|---|
| 1 | Red, Large, Cotton |
| 2 | Blue, Polyester |
如果你的Description字段可能包含NULL值,可以在子查询里加上ISNULL(Description, ''),避免拼接出NULL导致整个字符串失效。
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

