Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中查询XML片段而不考虑XML树的深度_Xml_Xpath_Sql Server 2012 - Fatal编程技术网

在SQL Server中查询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

我在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>
      </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)