获取XML节点值和所有嵌套列节点

时间:2017-03-25 15:56:46

标签: sql-server xml

我这里有一个我必须处理的XML文件的小提取:

<garRoot fileMaster="9371034.0582.30582">
  <garTransactions>
    <garTransaction InnerTransId="89274503">
      <garSection>
        <garSectionCounterFName />
        <garColumns />
        <garSection>
          <garSectionName>Header Section</ChapterName>
          <garSectionCounterFName />
          <garColumns />
          <garSection>
            <garSectionName>Startup</ChapterName>
            <garSectionCounterFName />
            <garColumns>
              <garColumn>
                <garColText>Idea Date:</garColText>
                <garColVal>2017-03-22</garColVal>
              </garColumn>
              <garColumn>
                <garColText>Idea Name:</garColText>
                <garColVal>The Invisible Cloak</garColVal>
              </garColumn>
            </garColumns>
          </garSection>

我尝试了一些代码来尝试:

  1. 首先获取每个InnerTransId的{​​{1}}值:

    garTransaction

  2. 因为实际上其他SELECT T.value('./@InnerTransID','varchar(50)') As InnerTransID FROM @XML.nodes('//garTransaction') AS GarT(T) 已嵌套garSection我试图通过{{1}获取所有garSectiongarColText }:

    garColVal

  3. 我遇到问题的地方,例如我知道每个交易ID都有145列,但我似乎无法将数据链接在一起,因为我需要返回:

    garColumn

1 个答案:

答案 0 :(得分:1)

您可以将CROSS APPLYOUTER APPLY用于此目的:

SELECT
    T.value('@InnerTransID','varchar(50)') As InnerTransID
    , C.value('garColText[1]','varchar(max)') As cText
    , C.value('garColVal[1]','varchar(max)') As cVal
FROM @XML.nodes('//garTransaction') AS GarT(T)
    OUTER APPLY T.nodes('.//garColumn') as garC(C)

注意nodes('.//garColumn')T的调用方式,结果garC(C)仅包含与当前garColumn相关的garTransaction