我有一个用xml节点和值填充的varchar(max)类型的列;例如,列数据以<tag1> <tag2>value1</tag2><tag3>value2</tag3>... </tag1>
开头。我需要从这个字符串中获取的是使用静态SQL或存储过程的表中每一行的一个单元格中的“value1 value2 value3 ... valueN”。节点树并不总是相同,有时路径为<tagX><tagY>valueY</tagY>...</tagX>
。
我对碎片xml的所有经验仅用于获取一个特定的值,属性或标记,而不是所有值,同时保留列和行计数。目前我查询然后循环遍历产品结束时的结果集并粉碎所有内容,但由于最近的更改,这不再是一个选项。
可以将列更改为xml类型,但如果可能,我希望避免这样做。
答案 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