回答

收藏

XML to SQL-选择多个具有相同名称的节点

技术问答 技术问答 270 人阅读 | 0 人回复 | 2023-09-12

我有可以从XML在文件中选择一些值的工作代码。问题是我有多个具有相同名称的节点。
* @: U3 T; |) L( k5 B2 v% z( q) T5 d这是XML的代码段:
6 }5 r* r; Q- E5 m- |: W            db69b722446c11de98360015c5e6daf6      AF      AFG      4              4516bf435611423ea4ee72fa842572a0        1                  12d859b8df024175a111da2e088250fb        ADDRESS_LINE_1_LOCAL            a      0                      85a6ab9412c44dd9a71a7e4760bf17fb        ADDRESS_LINE_2_LOCAL            b      0    我的SQL如下:
0 Y1 g1 ]3 e6 O) F8 hdeclare @inputxml table (x xml)insert @inputxmlselect xfrom OPENROWSET(BULK 'C:\ParallelTool\addcomp.xml',SINGLE_BLOB) As T(x);WITH XMLNAMESPACES(DEFAULT 'urn:com.workday.report/Countries_and_Their_Address_Components_Summary    select         xmldata.[ISO],xmldata.[Component 1],xmldata.[Component 2],xmldata.[Required]    into dbo.WD    from @inputxml    cross apply (       select             [ISO] = xmldata.value('(Country/ID)[3]','VARCHAR(MAX)        [Component 1] = xmldata.value('(Address_Components/Address_Component/ID)[2]','VARCHAR(MAX)        [Component 2] = xmldata.value('(Address_Components/Address_Component/ID)[2]','VARCHAR(MAX)        [Required] = xmldata.value('(Address_Components/Required)[1]','INT        from x.nodes('/Report_Data/Report_Entry') Z1(xmldata)   ) xmldata我得不到的是[组件2]。我认为文件中基本上选择了4 P3 Q7 z$ j4 r$ l4 i
Address_Component_Type_ID全部,但它们都被命名为相同的名称,在其他节点也被命名为相同的名称。SQL为了获得所有的组件类型,中间指定?感谢您的光临!3 B7 q( n" {( Z
                                                               
0 G2 x% g5 F" U. v    解决方案:                                                                : d+ i8 B' _3 A
                                                                这取决于你想要执行的操作…如果你知道要抓两个 Address_Components按以下方式修改查询:1 M7 q$ Q2 \" t# G6 z6 a& I
;WITH XMLNAMESPACES(DEFAULT 'urn:com.workday.report/Countries_and_Their_Address_Components_Summary    select         xmldata.[ISO],xmldata.[Component 1],xmldata.[Component 2],xmldata.[Required]    from @inputxml    cross apply (       select             [ISO] = xmldata.value('(Country/ID)[3]','VARCHAR(MAX)        [Component 1] = xmldata.value('(Address_Components/Address_Component/ID)[2]','VARCHAR(MAX)        [Component 2] = xmldata.value('(Address_Components[2]/Address_Component/ID)[2]','VARCHAR(MAX)        [Required] = xmldata.value('(Address_Components/Required)[1]','INT        from x.nodes('/Report_Data/Report_Entry') Z1(xmldata)   ) xmldata结果看起来像这样:
$ T% a9 p4 K/ Y9 _5 N: M8 H- PISO   Component             Component 2               Required----- ------------------------- ------------------------- -----------AFG   ADDRESS_LINE_1_LOCAL      ADDRESS_LINE_2_LOCAL     0但是,如果可以有任何数量的 Address_Components并且要将其捕获到单独的记录中,可以像下面这样重写查询:
7 r" D1 m# r1 G) g+ X;WITH XMLNAMESPACES(DEFAULT 'urn:com.workday.report/Countries_and_Their_Address_Components_Summary    select         [ISO] = Report_Entry.x.value('(Country/ID)[3]','VARCHAR(MAX)        ,[Component] = Address_Components.x.value('(Address_Component/ID)[2]','VARCHAR(MAX)        ,[Required] = Address_Components.x.value('(Required)[1]','INT    from @inputxml    cross apply x.nodes('/Report_Data/Report_Entry') Report_Entry(x)    cross apply Report_Entry.x.nodes('./Address_Components') Address_Components (x)结果看起来像这样:9 n- D% N7 j) S; q" e2 p
ISO   Component                 Required----- ------------------------- -----------AFG   ADDRESS_LINE_1_LOCAL     0AFG   ADDRESS_LINE_2_LOCAL     0
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则