如何在SQL2008R2中将行整理为分隔的字符串

时间:2012-08-31 17:26:24

标签: sql-server tsql

我们目前正在升级我们用C#编写的当前数据导入过程。

作为升级过程的一部分,我们需要根据旧系统的结果重新检查导入过程的结果。

我们所做的一项更改是将逗号分隔的列表分成另一个表中的行。这将使我们能够使用简单的连接过滤结果。

这是旧架构:

FormNumber      MainCategories
1               blue,green,red
2               yellow,red,blue
3               white

我们将其标准化为:

FormNumber      AttributeId      Value
1               1                blue
1               1                green
1               1                red
2               1                yellow
2               1                red
2               1                blue
3               1                white

现在,我们的下一步是确认两个过程的结果是相同的。其中一项检查是将旧流程的MainCategories字段与规范化表格的结果进行比较。

最后,这引出了一个问题:如何创建逗号分隔的新模式列表,以便与旧模式的值进行比较。

我们在这里尝试了@Ritesh提出的XMLPath解决方案:Concatenate many rows into a single text string?

以下是改编的sql语句:

Select distinct ST2.FormNumber, 
           (Select ST1.Value + ',' AS [text()]
            From cache.ArtifactAttribute ST1
            Where ST1.FormNumber= ST2.FormNumber
            ORDER BY ST1.FormNumber
            For XML PATH ('')) [Values]
     From cache.ArtifactAttribute ST2

问题是结果不正确。尽管FormNumber 1在表中只有三个条目,但“值”列(动态构建的分隔字符串)显示的结果不正确。显然我们没有正确实现sql代码。

我们做错了什么?

2 个答案:

答案 0 :(得分:1)

这似乎对我很好:

DECLARE @s TABLE(FormNumber INT, AttributeId INT, Value VARCHAR(32));

INSERT @s VALUES
(1,1,'blue'),
(1,1,'green'),
(1,1,'red'),
(2,1,'yellow'),
(2,1,'red'),
(2,1,'blue'),
(3,1,'white');

Select distinct ST2.FormNumber, 
           STUFF((Select ',' + ST1.Value AS [text()]
            From @s ST1
            Where ST1.FormNumber= ST2.FormNumber
            ORDER BY ST1.FormNumber
            For XML PATH ('')), 1, 1, '') [Values]
     From @s ST2;

结果:

FormNumber  Values
1           blue,green,red
2           yellow,red,blue
3           white

您确定您的数据是您认为的吗?您能否显示给出预期结果的样本数据?

答案 1 :(得分:1)

以下是您尝试的方法:

SELECT DISTINCT A.FormNumber, MainCategories
FROM YourTable A
CROSS APPLY (SELECT STUFF((SELECT ',' + Value 
                           FROM YourTable
                           WHERE FormNumber = A.FormNumber FOR XML PATH('')),1,1,'') MainCategories) B

虽然存在一个问题,即您无法确定连接项的顺序是否与您拥有的顺序相同,因为没有明确表示该顺序的列。这是一个有效的SQL Fiddle