【问题标题】:Different child nodes in the same XML同一个 XML 中的不同子节点
【发布时间】:2017-07-06 23:24:35
【问题描述】:

在 SQL Server 2008 中有一个要查询的带有 XML 列的表,并且需要获取作为“Inc”节点的子节点的节点的名称 - 在下面的“Architect”和“Professor”示例中”。我们不知道所有的子节点(Professor、Architect 等),所以我们不能只是外部应用所有潜在的子节点名称,但我们需要为每一行提取它们的值。 第一行:

  <Inc>
    <Architect>
        <ArchitectLevel>
          <Average>100000</Average>
        </ArchitectLevel>
    </Architect>
  </Inc>

第二行:

    <Inc>
        <Professor>
            <ProfessorLevel>
                <Maximum>100000</Maximum>
                <Minimum>1000</Minimum>
            </ProfessorLevel>
        </Professor>
    </Inc>

有人现在怎么做吗?

【问题讨论】:

  • 你能显示两行的预期结果吗

标签: sql sql-server xml


【解决方案1】:

使用local-name() 演示

declare @x xml =
'<Inc>
  <Architect>
        <ArchitectLevel>
          <Average>100000</Average>
        </ArchitectLevel>
    </Architect>
</Inc>
<Inc>
    <Professor>
        <ProfessorLevel>
            <Maximum>100000</Maximum>
            <Minimum>1000</Minimum>
        </ProfessorLevel>
    </Professor>
</Inc>';

select t.n.value('local-name(.)[1]','varchar(100)')
from @x.nodes('Inc/*') t(n)

【讨论】:

  • 谢谢@Serg。有没有办法只选择第一个子节点的名称?例如,如果 里面有 ,我们只会选择 吗?您的解决方案列出了所有这些。
  • 准确解析节点名称的规则是什么?为什么'Professor'和'Professor2'应该被认为是平等的?
  • @user3853657 在.nodes() 中使用[1] 谓词可能就足够了,如下所示:from @x.nodes('Inc/*[1]') t(n)
  • 谢谢,这就是我想要的,@Shnugo。我尝试使用不带 * 的 [1],但它不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 2020-09-22
  • 2016-02-02
相关资源
最近更新 更多