我有一个包含这样的XML的XML列:
<Set>
<Element>
<ID>
1
</ID>
<List>
<ListElement>
<Part1>
ListElement 1
</Part1>
</ListElement>
<ListElement>
<Part1>
ListElement2
</Part1>
</ListElement>
</List>
</Element>
<Element>
<ID>
2
</ID>
<List>
<ListElement>
<Part1>
ListElement3
</Part1>
</ListElement>
<ListElement>
<Part1>
ListElement4
</Part1>
</ListElement>
</List>
</Element>
</Set>
我想把它粉碎成一个包含这个的关系表:
ID, ListElement
1, ListElement1
1, ListElement2
2, ListElement3
2, ListElement4
我可以使用以下内容获取部件的内容:
select
List.value('(Part1/text())[1]', 'varchar(max)') as test
from
Table CROSS APPLY
xml.nodes('// Element/List/ListElement') AS List(List)
但我还没有实现保留'外键'(ID值)。
感谢。
祝福,
基督教
答案 0 :(得分:0)
尝试此操作而不是查询:
SELECT
List.value('(../../ID)[1]', 'int') AS 'ID',
List.value('(Part1/text())[1]', 'varchar(max)') as test
FROM
dbo.Table
CROSS APPLY
xml.nodes('/Set/Element/List/ListElement') AS List(List)
再次更新 - 现在只返回一个CROSS APPLY,在XPath中使用../../ID
返回到祖父母的“ID”元素。同样消除了//Element
XPath,转而使用/Set/Element
(//Element
xpaths出了名的慢)
答案 1 :(得分:0)
如果有人想用XQuery做这件事:
<Table>
{for $listElement in $table//ListElement
return
<Row>
{$listElement/../../ID}
{$listElement/Part1}
</Row>
}
</Table>
其中$ table是原始XML
返回
<Table>
<Row>
<ID> 1 </ID>
<Part1> ListElement 1 </Part1>
</Row>
<Row>
<ID> 1 </ID>
<Part1> ListElement2 </Part1>
</Row>
<Row>
<ID> 2 </ID>
<Part1> ListElement3 </Part1>
</Row>
<Row>
<ID> 2 </ID>
<Part1> ListElement4 </Part1>
</Row>
</Table>