从sql中的xml中提取具有相同xpath的多个实例

从sql中的xml中提取具有相同xpath的多个实例,sql,sql-server,xml,tsql,xpath,Sql,Sql Server,Xml,Tsql,Xpath,我有这样一个xml: <root> <parentTag> <child1>p1c1</child1> <child2>p1c2</child2> <child3>p1c3</child3> </parentTag> <parentTag> <child1>p2c1</child1> <

我有这样一个xml:

<root>
  <parentTag>
    <child1>p1c1</child1>
    <child2>p1c2</child2>
    <child3>p1c3</child3>
  </parentTag>      
  <parentTag>
    <child1>p2c1</child1>
    <child2>p2c2</child2>
    <child3>p2c3</child3>
  </parentTag>
  <parentTag>
    <child1>p3c1</child1>
    <child2>p3c2</child2>
    <child3>p3c3</child3>
  </parentTag>
</root>
DECLARE @xml XML=N'<root>
  <parentTag>
    <child1>p1c1</child1>
    <child2>p1c2</child2>
    <child3>p1c3</child3>
  </parentTag>      
  <parentTag>
    <child1>p2c1</child1>
    <child2>p2c2</child2>
    <child3>p2c3</child3>
  </parentTag>
  <parentTag>
    <child1>p3c1</child1>
    <child2>p3c2</child2>
    <child3>p3c3</child3>
  </parentTag>
</root>';

SELECT nd.value('(*[local-name()="child1"])[1]','nvarchar(max)') AS Child1
      ,nd.value('(*[local-name()="child2"])[1]','nvarchar(max)') AS Child2
      ,nd.value('(*[local-name()="child3"])[1]','nvarchar(max)') AS Child3
FROM @xml.nodes('/root/parentTag') AS A(nd)

此外,表中有多条记录具有相同的xml,我试图从所有记录中获取child1、child2和child3记录中的所有数据。请帮助。

您没有标记RDBMS,这是SQL Server语法。但是-由于您也使用了
XPath
-标记,其他DBMS将处理类似的问题

首先使用类似于
.nodes()
的函数来按行获取
-节点。然后使用
XQuery
-expression
[local-name()=“child1”]
读取具有给定名称的子元素

试着这样做:

<root>
  <parentTag>
    <child1>p1c1</child1>
    <child2>p1c2</child2>
    <child3>p1c3</child3>
  </parentTag>      
  <parentTag>
    <child1>p2c1</child1>
    <child2>p2c2</child2>
    <child3>p2c3</child3>
  </parentTag>
  <parentTag>
    <child1>p3c1</child1>
    <child2>p3c2</child2>
    <child3>p3c3</child3>
  </parentTag>
</root>
DECLARE @xml XML=N'<root>
  <parentTag>
    <child1>p1c1</child1>
    <child2>p1c2</child2>
    <child3>p1c3</child3>
  </parentTag>      
  <parentTag>
    <child1>p2c1</child1>
    <child2>p2c2</child2>
    <child3>p2c3</child3>
  </parentTag>
  <parentTag>
    <child1>p3c1</child1>
    <child2>p3c2</child2>
    <child3>p3c3</child3>
  </parentTag>
</root>';

SELECT nd.value('(*[local-name()="child1"])[1]','nvarchar(max)') AS Child1
      ,nd.value('(*[local-name()="child2"])[1]','nvarchar(max)') AS Child2
      ,nd.value('(*[local-name()="child3"])[1]','nvarchar(max)') AS Child3
FROM @xml.nodes('/root/parentTag') AS A(nd)

其余部分与上面相同。

您没有标记RDBMS,这是SQL Server语法。但是-由于您也使用了
XPath
-标记,其他DBMS将处理类似的问题

首先使用类似于
.nodes()
的函数来按行获取
-节点。然后使用
XQuery
-expression
[local-name()=“child1”]
读取具有给定名称的子元素

试着这样做:

<root>
  <parentTag>
    <child1>p1c1</child1>
    <child2>p1c2</child2>
    <child3>p1c3</child3>
  </parentTag>      
  <parentTag>
    <child1>p2c1</child1>
    <child2>p2c2</child2>
    <child3>p2c3</child3>
  </parentTag>
  <parentTag>
    <child1>p3c1</child1>
    <child2>p3c2</child2>
    <child3>p3c3</child3>
  </parentTag>
</root>
DECLARE @xml XML=N'<root>
  <parentTag>
    <child1>p1c1</child1>
    <child2>p1c2</child2>
    <child3>p1c3</child3>
  </parentTag>      
  <parentTag>
    <child1>p2c1</child1>
    <child2>p2c2</child2>
    <child3>p2c3</child3>
  </parentTag>
  <parentTag>
    <child1>p3c1</child1>
    <child2>p3c2</child2>
    <child3>p3c3</child3>
  </parentTag>
</root>';

SELECT nd.value('(*[local-name()="child1"])[1]','nvarchar(max)') AS Child1
      ,nd.value('(*[local-name()="child2"])[1]','nvarchar(max)') AS Child2
      ,nd.value('(*[local-name()="child3"])[1]','nvarchar(max)') AS Child3
FROM @xml.nodes('/root/parentTag') AS A(nd)

其余部分与上面相同。

标签
sql
不够。。。请始终标记实际的RDBMS(供应商和版本)!标签
sql
不够。。。请始终标记实际的RDBMS(供应商和版本)!好的,如何引用表中的xml?xmltype的列名是xml_infook,如何引用表中的xml?xmltype的列名是xml_info