检索多个xml子节点值

时间:2014-01-22 20:56:14

标签: sql sql-server xml stored-procedures

我有一个用xml节点和值填充的​​varchar(max)类型的列;例如,列数据以<tag1> <tag2>value1</tag2><tag3>value2</tag3>... </tag1>开头。我需要从这个字符串中获取的是使用静态SQL或存储过程的表中每一行的一个单元格中的“value1 value2 value3 ... valueN”。节点树并不总是相同,有时路径为<tagX><tagY>valueY</tagY>...</tagX>

我对碎片xml的所有经验仅用于获取一个特定的值,属性或标记,而不是所有值,同时保留列和行计数。目前我查询然后循环遍历产品结束时的结果集并粉碎所有内容,但由于最近的更改,这不再是一个选项。

可以将列更改为xml类型,但如果可能,我希望避免这样做。

1 个答案:

答案 0 :(得分:1)

将列转换为XML(或将其在表中更改为XML)并在//*上粉碎xml以获取表中的所有节点。然后,您可以使用for xml path将值重新连接起来。

select (
       select ' '+X.N.value('text()[1]', 'varchar(max)')
       from (select cast(T.XMLCol as xml)) as T1(XMLCol)
         cross apply T1.XMLCol.nodes('//*') as X(N)
       for xml path(''), type
       ).value('substring(text()[1], 2)', 'varchar(max)')
from T

SQL Fiddle