2010-12-07 5 views
5

J'ai une donnée stockée dans une colonne xml et j'ai besoin d'une liste de nœuds enfants séparés par des virgules. En utilisant le script ci-dessous, je peux seulement obtenir "A B C". S'il vous plaît aidez-moi à obtenir "A, B, C" en utilisant xquery (Remplacer simplement l'espace par une virgule n'aide pas car nous avons des données avec des espaces à l'intérieur).Récupère les nœuds XML de la colonne SQL Server en tant que liste séparée par des virgules.

create table Temp12345 (col1 xml) 
go 

insert into Temp12345 (col1) 
values('<fd><field i="22"><v>A</v><v>B</v><v>C</v></field></fd>') 
go 

select col1.value('(/fd/field[@i=22])[1] ', 'NVarchar(Max)') 
from Temp12345 
go 

drop table Temp12345 
go 

Répondre

8

Essayez ceci:

SELECT 
    STUFF((SELECT 
       ',' + fd.v.value('(.)[1]', 'varchar(10)') 
      FROM 
       Temp12345 
      CROSS APPLY 
       col1.nodes('/fd/field/v') AS fd(v) 
      FOR XML PATH('') 
     ), 1, 1, '') 

Cela me donne A,B,C - ça marche pour vous aussi?

+0

+1 pour une réponse de travail. Par curiosité, je vois que vous utilisez CROSS APPLY. J'ai fait quelque chose de similaire avec un CTE. Y a-t-il un avantage significatif à l'une ou l'autre approche? – IamIC

+0

@IanC: pas sûr - il faudrait voir votre CTE :-) C'est juste comme je sais que je peux "déchiqueter" une liste de nœuds XML dans une "pseudo-table" de ligne, pour en extraire des morceaux individuels . –

+0

@marc pas la même application, mais il interroge le XML de la même manière: avec T AS ( \t \t \t SELECT \t x.node.value ('fn:. Local-name()', « varchar (50) ') AS RankItem, \t \t \t \t \t x.node.value (' (.) », 'float') AS Valeur \t \t \t DE \t @ xml.nodes ('/ data/*') AS x (node) \t \t - select * direct * enfants du noeud 'data' racine \t \t \t \t SELECT \t @OutOfBounds = Count (t.RankItem) \t \t DE \t t INNER JOIN [entier] .RankItems AS ri ON ri.RankItem = t.RankItem \t \t OÙ \t (t.Value ri. [Max]) – IamIC

0

Dans un plein processeur XQuery vous plaindre pourrait utiliser simplement:

(/fd/field[@i=22])[1]/string-join(*,',') 
+0

Ne fonctionne pas dans SQL Server cependant. Il donne l'erreur 'La syntaxe XQuery '/ function()' n'est pas supportée. ' –

+0

@Martin: Oui, mais pas même' fn: string-join() 'est supporté –

+0

Il supporte' concat' mais je ne pouvais pas trouver un moyen utile de l'utiliser. '' concat ((/ fd/field [@ i = 22]) [1], '', '') ''donne simplement' ABC, ' –

Questions connexes