J'ai une source de données qui contient des données dans des champs délimités qui existent dans une zone de transfert dans SQL Server. Je voudrais transformer ces données en plusieurs lignes afin qu'il soit plus facile de travailler avec. Cela diffère des nombreuses autres questions et réponses sur des sujets similaires en ce sens que j'ai plusieurs champs où ces données délimitées existent. Voici un exemple de ce que mes données ressemble à:Conversion de plusieurs champs délimités en lignes dans SQL Server
ID | Field | Value
---+-------+------
1 | a,b,c | 1,2,3
2 | a,c | 5,2
Et ceci est la sortie désirée:
ID | Field | Value
---+-------+------
1 | a | 1
1 | b | 2
1 | c | 3
2 | a | 5
2 | c | 2
Mon code si utilise beaucoup la méthode d'analyse XML comme celui mentionné ici: Turning a Comma Separated string into individual rows je avais besoin pour l'étendre afin de joindre chaque champ à sa valeur correspondante, ce que j'ai fait en générant un row_number pour chaque ID, puis en faisant une correspondance en fonction de l'ID et de ce row_number. Mon problème est que c'est douloureusement lent, alors je me suis demandé si quelqu'un avait des méthodes plus performantes?
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
Hm ... votre solution semble être un peu bogué: il renvoie les ID, mais ni les champs, ni les valeurs ... le plus certainement parce que vous sélectionnez NULL dans la première itération, puis sous-chaîne de NULL dans le prochain ... – Tyron78
Parfait. Ajout d'une version de travail aussi. – Tyron78