2010-04-12 13 views
0

I possède une colonne XML qui contiennent des données comme suit:xml déchiqueter avec un nombre variable de noeuds

<AuthorList CompleteYN="Y"> 
<Author ValidYN="Y"> 
<LastName>Alió</LastName> 
<ForeName>J L</ForeName> 
<Initials>JL</Initials> 
</Author> 
<Author ValidYN="Y"> 
<LastName>Ortiz</LastName> 
<ForeName>D</ForeName> 
<Initials>D</Initials> 
</Author> 
<Author ValidYN="Y"> 
<LastName>Muftuoglu</LastName> 
<ForeName>O</ForeName> 
<Initials>O</Initials> 
</Author> 
<Author ValidYN="Y"> 
<LastName>Garcia</LastName> 
<ForeName>M J</ForeName> 
<Initials>MJ</Initials> 
</Author> 
</AuthorList> 

le nombre d'auteurs est variable. Je n'ai pas de problème pour extraire les premiers auteurs etc .:

SELECT 
ID, 
AuthorList.value('(Author/ForeName)[1]', 'varchar(max)') as ForeName, 
AuthorList.value('(Author/LastName)[1]', 'varchar(max)') as LastName, 
AuthorList.value('(Author/Initials)[1]', 'varchar(max)') as Initials 
FROM 
     XMLs CROSS APPLY 
     xml.nodes('//AuthorList') AS AuthorList(AuthorList) 

Je suis juste curieux de savoir comment je peux obtenir quelque chose comme ceci 'dynamique':

1 JL Alió JL 1 D Ortiz D 1 O Muftuoglu O 1 MJ Garcia MJ

Merci!

Répondre

0

Cela semble faire le travail:

select 
    AuthorList.value('(ForeName/text())[1]', 'varchar(max)') as ForeName, 
    AuthorList.value('(LastName/text())[1]', 'varchar(max)') as LastName, 
    AuthorList.value('(Initials/text())[1]', 'varchar(max)') as Initials 
from 
    XMLs CROSS APPLY 
     xml.nodes('//AuthorList/Author') AS AuthorList(AuthorList)