我有一个带有 XML 列的表。每个条目的 XML 结构都是完全扁平的,甚至没有父标签 - 这是一个条目的示例:
<tag1>1.22</tag1>
<tag3>5</tag3>
<tag12>-1.22</tag>
到目前为止,我已经能够做这样的事情:
SELECT CAST(xml_column AS NVARCHAR(MAX)) as XML_text
并在我这边解析 XML。或者我显然可以写xpath
查询将标签选择到列中,这就是我想要的,除了大约有 1000 个可能的标签名称,而且我不想将它们全部写出来(并且可能会漏掉一个)。
简而言之,我该如何处理:
| ID | XML type column |
| 1 | <tag1>1</tag1><tag2>2</tag2> |
| 2 | <tag2>8</tag2><tag34>1</tag34> |
对此:
| ID | tag1 | tag2 | tag34 |
| 1 | 1 | 2 | NULL |
| 2 | NULL | 8 | 1 |
对于我可以在数据集中找到的任何标签,在事先不知道他们的情况下?我也愿意解决这个问题:
| ID | tag | value |
| 1 | tag1 | 1 |
| 1 | tag2 | 2 |
| 2 | tag2 | 8 |
| 2 | tag34 | 1 |
以下将改变你没有根节点的平面 XML进入经典的 EAV 列表:
DECLARE @tbl TABLE(ID INT IDENTITY, YourXml XML);
INSERT INTO @tbl VALUES
('<tag1>1</tag1><tag2>2</tag2>')
,('<tag3>3</tag3><tag4>4</tag4><tag5>5</tag5>');
--查询
SELECT t.ID
,AllNodes.value('local-name(.)','nvarchar(max)') AS TagName
,AllNodes.value('text()[1]','nvarchar(max)') AS TagValue
FROM @tbl t
CROSS APPLY t.YourXml.nodes('/*') A(AllNodes);
XQuery 函数local-name()
允许查询元数据,text()
节点代表元素的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)