使用多个子节点数据将XML数据解析为SQL

使用多个子节点数据将XML数据解析为SQL,sql,sql-server,xml,xpath,sqlxml,Sql,Sql Server,Xml,Xpath,Sqlxml,我有一个包含以下数据的xml文件 <SearchProgramsResponse xmlns="http://api.abc.com/2011-03-01/"> <page>1</page> <items>50</items> <total>3129</total> <programItems> <programItem id="7779"> <name>Coolblue NL

我有一个包含以下数据的xml文件

<SearchProgramsResponse xmlns="http://api.abc.com/2011-03-01/">
<page>1</page>
<items>50</items>
<total>3129</total>
<programItems>
<programItem id="7779">
<name>Coolblue NL</name>
<adrank>5.4</adrank>
<categories>
<category id="40">Cell, Phone &amp; Fax</category>
<category id="11">Internet services</category>
</categories>
</programItem>


<programItem id="7780">
<name>ABC NL</name>
<adrank>2.4</adrank>
<categories>
<category id="42">Cell</category>
<category id="12">services</category>
</categories>
</programItem>
</programItems>
</SearchProgramsResponse>
我已经看过XML引用,但都是单值XML属性,如何处理这种类型的XML

我尝试了下面两个问题,但都没有成功

DECLARE @xmldata XML 
SET @xmldata =
N'<SearchProgramsResponse xmlns="http://api.abc.com/2011-03-01/">
<page>1</page>
<items>50</items>
<total>3129</total>
<programItems>
<programItem id="7779">
<name>Coolblue NL</name>
<adrank>5.4</adrank>
<categories>
<category id="40">Cell, Phone &amp; Fax</category>
<category id="11">Internet services</category>
</categories>
</programItem>
<programItem id="7780">
<name>ABC NL</name>
<adrank>2.4</adrank>
<categories>
<category id="42">Cell</category>
<category id="12">services</category>
</categories>
</programItem>
</programItems>
</SearchProgramsResponse>';



SELECT  
       Tbl.Col.value('name[1]', 'varchar(70)')
FROM   @xmldata.nodes('/SearchProgramsResponse/programItems/programItem') Tbl(Col)  


SELECT
     XReservering.value('@programItem', 'int'),
     XOpties.value('(.)', 'varchar(50)')
FROM
    @xmldata.nodes('/SearchProgramsResponse/programItems/programItem') AS XTbl1(XReservering)
CROSS APPLY
    XReservering.nodes('categories/category') AS XTbl2(XOpties)
DECLARE@xmldataxml
SET@xmldata=
不
1.
50
3129
酷蓝NL
5.4
手机,电话及;传真
互联网服务
ABC荷兰
2.4
细胞
服务
';
挑选
Tbl.Col.value('name[1],'varchar(70)'
从@xmldata.nodes('/SearchProgramsResponse/programItems/programItem')Tbl(列)
挑选
XReservering.value('@programItem',int'),
XOpties.value(“(”,“varchar(50)”)
从…起
@节点('/SearchProgramsResponse/programItems/programItem')作为XTbl1(XReserving)
交叉应用
XReservering.nodes('categories/category')作为XTbl2(XOpties)

您可以两次应用
节点()
函数,以获取所有具有
项目id的类别:

;with xmlnamespaces(default 'http://api.abc.com/2011-03-01/')
select
    t.c.value('@id', 'int') as id,
    t.c.value('(name/text())[1]', 'nvarchar(max)') as name,
    t.c.value('(adrank/text())[1]', 'decimal(29,10)') as adrank
from @data.nodes('SearchProgramsResponse/programItems/programItem') as t(c)

;with xmlnamespaces(default 'http://api.abc.com/2011-03-01/')
select
    t.c.value('@id', 'int') as item_id,
    c.c.value('@id', 'int') as category_id,
    c.c.value('text()[1]', 'nvarchar(max)') as category_name
from @data.nodes('SearchProgramsResponse/programItems/programItem') as t(c)
    outer apply t.c.nodes('categories/category') as c(c)

非常感谢,这正是我需要的
;with xmlnamespaces(default 'http://api.abc.com/2011-03-01/')
select
    t.c.value('@id', 'int') as id,
    t.c.value('(name/text())[1]', 'nvarchar(max)') as name,
    t.c.value('(adrank/text())[1]', 'decimal(29,10)') as adrank
from @data.nodes('SearchProgramsResponse/programItems/programItem') as t(c)

;with xmlnamespaces(default 'http://api.abc.com/2011-03-01/')
select
    t.c.value('@id', 'int') as item_id,
    c.c.value('@id', 'int') as category_id,
    c.c.value('text()[1]', 'nvarchar(max)') as category_name
from @data.nodes('SearchProgramsResponse/programItems/programItem') as t(c)
    outer apply t.c.nodes('categories/category') as c(c)