我有一个数据源,其中包含SQL Server中分段区域中存在的分隔字段中的数据。我想将这些数据转换成多行,因此更容易处理。这不同于类似主题的众多其他问题和答案,因为我有多个字段,其中存在分隔数据。以下是对我的数据看起来像一个例子:将多个分隔字段转换为SQL Server中的行
ID | Field | Value
---+-------+------
1 | a,b,c | 1,2,3
2 | a,c | 5,2
这是所需的输出:
ID | Field | Value
---+-------+------
1 | a | 1
1 | b | 2
1 | c | 3
2 | a | 5
2 | c | 2
到目前为止我的代码使用的XML解析方法像这里提到的:Turning a Comma Separated string into individual rows我需要通过为每个ID生成一个row_number,然后根据ID和这个row_number进行匹配,扩展它以将每个字段连接到它所对应的值。
我的问题是它太痛苦了,所以我想知道是否有人有更多的性能方法?
select
[Value].ID, [Field], [Value]
from
(select
A.ID, Split.a.value('.', 'varchar(100)') as [Value],
row_number() over (partition by ID order by Split.a) as RowNumber
from
(select
ID, cast('<M>' + replace([Value], ',', '</M><M>') + '</M>' as xml) as [Value]
from
#source_table
where
[Field] not like '%[<>&%]%' and [Value] not like '%[<>&%]%') as A
cross apply
[Value].nodes ('/M') as Split(a)
) [Value]
inner join
(
select
A.ID, Split.a.value('.', 'varchar(100)') as [Field],
row_number() over (partition by A.ID order by Split.a) as RowNumber
from
(select
ID, cast('<M>' + replace([Field], ',', '</M><M>') + '</M>' as xml) as [Field]
from
#source_table
where
[Field] not like '%[<>&%]%' and [Value] not like '%[<>&%]%') as A
cross apply
[Field].nodes ('/M') as Split(a)
) [Field] on [Value].ID = [Field].ID and [Value].RowNumber = [Field].RowNumber
嗯...您的解决方案似乎是有点马车:它返回的ID,但无论是场也不值...最肯定的是因为你在第一次迭代中选择NULL,然后在下一次选择NULL的子串。 – Tyron78
完美。也增加了一个工作版本。 – Tyron78