在SQL Server中查询XML片段而不考虑XML树的深度
我在SQLServer中有一些XML(XML类型的列),看起来有点像这样在SQL Server中查询XML片段而不考虑XML树的深度,xml,xpath,sql-server-2012,Xml,Xpath,Sql Server 2012,我在SQLServer中有一些XML(XML类型的列),看起来有点像这样 <TreeRoot> <Node id="12" name="name2"> <Node id="54" name="name4654"> <Node id="75" name="name0943> <Node id="58" name="dfd2"> </Node> </Nod
<TreeRoot>
<Node id="12" name="name2">
<Node id="54" name="name4654">
<Node id="75" name="name0943>
<Node id="58" name="dfd2">
</Node>
</Node>
<Node id="43" name="543d32">
</Node>
</Node>
</Node>
</TreeRoot>
我已经有了一个这样做的查询,但是它是硬编码到树的特定级别的,这意味着我需要在向xml片段添加节点时更新这个查询
有没有一种方法可以构造一个XPath查询来给出这个列表,并且足够健壮,可以在将来处理额外的级别
谢谢
:-)
/小丑
丹麦哥本哈根这个怎么样:
DECLARE @XmlTable TABLE (ID INT NOT NULL, XmlData XML)
INSERT INTO @XmlTable
(ID, XmlData)
VALUES
(1, '<TreeRoot>
<Node id="12" name="name2">
<Node id="54" name="name4654">
<Node id="75" name="name0943">
<Node id="58" name="dfd2">
</Node>
</Node>
<Node id="43" name="543d32">
</Node>
</Node>
</Node>
</TreeRoot>')
SELECT
NodeName = XC.value('@name', 'varchar(50)'),
NodeID = XC.value('@id', 'int')
FROM @XmlTable
CROSS APPLY XmlData.nodes('//Node') AS XT(XC)
DECLARE@XmlTable表(ID INT不为NULL,XmlData XML)
插入@XmlTable
(ID,XmlData)
价值观
(1, '
')
挑选
NodeName=XC.value('@name','varchar(50)'),
NodeID=XC.value('@id',int')
来自@XmlTable
交叉应用XmlData.nodes('//Node')作为XT(XC)
给我你想要的输出
基本上,.nodes()
将返回一个对应于调用中XPath表达式的XML片段的“虚拟”表,/Node
将选择所有
元素,而不管它们在XML树中的位置如何。不确定这在大型XML结构上是否会非常快,但它应该可以工作
DECLARE @XmlTable TABLE (ID INT NOT NULL, XmlData XML)
INSERT INTO @XmlTable
(ID, XmlData)
VALUES
(1, '<TreeRoot>
<Node id="12" name="name2">
<Node id="54" name="name4654">
<Node id="75" name="name0943">
<Node id="58" name="dfd2">
</Node>
</Node>
<Node id="43" name="543d32">
</Node>
</Node>
</Node>
</TreeRoot>')
SELECT
NodeName = XC.value('@name', 'varchar(50)'),
NodeID = XC.value('@id', 'int')
FROM @XmlTable
CROSS APPLY XmlData.nodes('//Node') AS XT(XC)