【问题标题】:MSSQL Parsing of XML that Contains same Sibling包含相同兄弟的 XML 的 MSSQL 解析
【发布时间】:2017-10-27 20:44:16
【问题描述】:

我正在尝试查询具有 XML 的 MSSQL 数据库并将其解析出来。

这是数据:

<Root>
<Relatives>
<Relative>
  <Relation>Father</Relation>
  <BcAge>50</BcAge>
  <BilatAge>0</BilatAge>
  <OcAge>0</OcAge>
</Relative>
<Relative>
  <Relation>Mother</Relation>
  <BcAge>58</BcAge>
  <BilatAge>0</BilatAge>
  <OcAge>0</OcAge>
</Relative>

这是想要的结果

Relation BcAge BilatAge OcAge Relation BcAge BilatAge OcAge 
Father   50     0       0      Mother  58    0         0

【问题讨论】:

    标签: sql-server xml tsql xpath xquery


    【解决方案1】:

    我怀疑您是否真的希望并排获得结果...这不是有效的结果集,您的列名重复。

    如果你真的需要这种方式,你可以这样做:

    DECLARE @xml XML=
    N'<Root>
    <Relatives>
    <Relative>
      <Relation>Father</Relation>
      <BcAge>50</BcAge>
      <BilatAge>0</BilatAge>
      <OcAge>0</OcAge>
    </Relative>
    <Relative>
      <Relation>Mother</Relation>
      <BcAge>58</BcAge>
      <BilatAge>0</BilatAge>
      <OcAge>0</OcAge>
    </Relative>
    </Relatives>
    </Root>';
    

    查询将使用 CTE 来获取具有 XQuery-predicate 的父亲和母亲

    WITH Parents AS
    (
        SELECT @xml.query(N'/Root/Relatives/Relative[(Relation/text())[1]="Father"]') AS Father
              ,@xml.query(N'/Root/Relatives/Relative[(Relation/text())[1]="Mother"]') AS Mother
    )
    SELECT 'Father' AS F_Relation
          ,Father.value(N'(/Relative/BcAge)[1]',N'int') AS F_BcAge
          ,Father.value(N'(/Relative/BilatAge)[1]',N'int') AS F_BilatAge
          ,Father.value(N'(/Relative/OcAge)[1]',N'int') AS F_OcAge
          ,'Mother' AS M_Relation   
          ,Mother.value(N'(/Relative/BcAge)[1]',N'int') AS M_BcAge
          ,Mother.value(N'(/Relative/BilatAge)[1]',N'int') AS M_BilatAge
          ,Mother.value(N'(/Relative/OcAge)[1]',N'int') AS M_OcAge
    FROM Parents;
    

    但您可能正在寻找的就是这个(&lt;Relative&gt; 的任意数量):

    SELECT rel.value(N'(Relation/text())[1]',N'nvarchar(max)') AS Relation
          ,rel.value(N'(BcAge/text())[1]',N'int') AS BcAge
          ,rel.value(N'(BilatAge/text())[1]',N'int') AS BilatAge
          ,rel.value(N'(OcAge/text())[1]',N'int') AS OcAge
    FROM @xml.nodes(N'/Root/Relatives/Relative') AS A(rel)
    

    【讨论】:

      猜你喜欢
      • 2020-12-17
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多