0

我正在寻找一个数据库脚本,它将通过一个表并给我一个逗号分隔的输出。

我需要在一次性脚本中完成这一切。我正在考虑从仅包含 ID 的临时表开始,然后获取所有项目,但我不确定如何“foreach”数据库。

What I have                    What I'm looking for

 ID | Items                       ID | Items
 1  |  A                          1  | A,B,C,D
 1  |  B                          2  | A,B,C
 1  |  C                          3  | B,C
 1  |  D
 2  |  A
 2  |  B
 2  |  C
 3  |  B 
 3  |  C
4

2 回答 2

0

可能是我的想象,但这似乎运行得更快,查询计划更容易阅读。但是,查询计划中的 xmlreader 似乎总是高估实际查询成本。

declare @table table (
id int
,val varchar(2)
)
insert @table
Values (1 ,'a'),
(1,'b'),
(1,'c'),
(1,'d'),
(2,'a'),
(2,'b'),
(2,'c'),
(3,'a'),
(3,'b')
select id, stuff((
select (','+val) from @table q1
    where q1.id = q2.id
    for xml path('')),1,1,'') val
    from @table q2
    group by q2.id

这几乎做同样的事情,除了它通过制作没有元素规范的不正确的 xml 文档来排除 xml 的数据读取器。至于内置函数的东西,请参见http://msdn.microsoft.com/en-us/library/ms188043.aspx 他正在使用东西来操作字符串。如果你添加逗号,你要么得到一个结尾有一个额外逗号的字符串,要么在开头有一个逗号。此示例将字符串中从位置 1 开始的前 2 个字符替换为空白字符串''

select STUFF(',,test,test1,test2,test3',1,2,'') 

数据:

test,test1,test2,test3
于 2012-04-20T20:28:52.370 回答
0
declare @t table(id int, items varchar(8));
insert into @t values(1,'A')
, (1,'B')
, (1,'C')
, (1,'D')
, (2,'A')
, (2,'B')
, (2,'C')
, (3,'B')
, (3,'C')

select distinct id
, (STUFF((SELECT ',' + items FROM @t t2 WHERE  t1.id = t2.id ORDER BY items
FOR XML PATH(''), TYPE, ROOT).value('root[1]','nvarchar(max)'),1,1,'')) as items
from @t t1

结果:

id          items
----------- ------------------------
1           A,B,C,D
2           A,B,C
3           B,C
于 2012-04-20T19:28:07.343 回答