2010-12-07 11 views
5

Tengo una información almacenada en una columna xml y necesito una lista de nodos secundarios separados por comas. Usando el script a continuación, solo puedo obtener "A B C". Ayúdame a obtener "A, B, C" usando xquery (el simple reemplazo de espacio con coma no ayuda porque tenemos datos con espacios adentro).Obtener nodos XML de la columna del servidor SQL como lista separada por comas

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 

Respuesta

8

Prueba esto:

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, '') 

Esto me da A,B,C - funciona para usted, también?

+0

+1 para una respuesta de trabajo. Por curiosidad, veo que estás usando CROSS APPLY. He hecho algo similar con un CTE. ¿Hay alguna ventaja significativa para cualquiera de los enfoques? – IamIC

+0

@IanC: no estoy seguro - tendría que ver su CTE :-) Así es como sé que puedo "triturar" una lista de nodos XML en una "pseudo-tabla" de filas, para tomar partes individuales de ella . –

+0

no @marc la misma aplicación, pero consulta el XML de una manera similar: con T AS ( \t \t \t SELECT \t x.node.value ('fn:.-Nombre local()', 'varchar (50) ') AS RankItem, \t \t \t \t \t x.node.value (' (.)', 'float') como valor de \t \t \t DE \t @ xml.nodes ('/ datos/*') AS x (nodo) \t \t - seleccione * direct * hijos del nodo raíz 'datos' \t \t) \t \t SELECT \t @OutOfBounds = Count (t.RankItem) \t \t DE \t t INNER JOIN [int] .RankItems AS ri EN ri.RankItem = t.RankItem \t \t DONDE \t (t.value ri. [Max]) – IamIC

0

En un completo procesador de XQuery se quejan de que podría utilizar simplemente:

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

Sin embargo, no funciona en SQL Server. Da el error 'La sintaxis XQuery '/ function()' no es compatible. –

+0

@Martin: Sí, pero ni siquiera se admite' fn: string-join() ' –

+0

Es compatible con' concat' pero no pude descubrir alguna forma útil de usarlo. ''concat ((/ fd/field [@ i = 22]) [1], '', '') '' solo da 'ABC,' –

Cuestiones relacionadas