我这里有一个我必须处理的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>
我尝试了一些代码来尝试:
首先获取每个InnerTransId
的{{1}}值:
garTransaction
因为实际上其他SELECT
T.value('./@InnerTransID','varchar(50)') As InnerTransID
FROM @XML.nodes('//garTransaction') AS GarT(T)
已嵌套garSection
我试图通过{{1}获取所有garSection
和garColText
}:
garColVal
我遇到问题的地方,例如我知道每个交易ID都有145列,但我似乎无法将数据链接在一起,因为我需要返回:
garColumn
答案 0 :(得分:1)
您可以将CROSS APPLY
或OUTER 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
。