Sql 分解xml列
我有一个XML列,其中包含如下XML:Sql 分解xml列,sql,sql-server-2005,xquery,Sql,Sql Server 2005,Xquery,我有一个XML列,其中包含如下XML: <Set> <Element> <ID> 1 </ID> <List> <ListElement> <Part1> ListElement 1 </Part1> </ListElement> <List
<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>
select
List.value('(Part1/text())[1]', 'varchar(max)') as test
from
Table CROSS APPLY
xml.nodes('// Element/List/ListElement') AS List(List)
我可以通过以下方式获得零件的内容:
<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>
select
List.value('(Part1/text())[1]', 'varchar(max)') as test
from
Table CROSS APPLY
xml.nodes('// Element/List/ListElement') AS List(List)
但我还没有实现保留“外键”(ID值)
谢谢
致以最良好的祝愿
Christian尝试以下内容,而不是您的查询:
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)
再次更新-现在只返回一个交叉应用,使用XPath中的
。/../ID
返回到父代的“ID”元素。还取消了//Element
XPath,取而代之的是/Set/Element
(//Element
XPath速度非常慢)以防有人想用XQuery执行此操作:
<Table>
{for $listElement in $table//ListElement
return
<Row>
{$listElement/../../ID}
{$listElement/Part1}
</Row>
}
</Table>
{对于$table//liselement中的$liselement
回来
{$liselement/./../ID}
{$liselement/Part1}
}
其中$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>
1.
清单1
1.
听众2
2.
听众3
2.
听众4
此处的空白是为了让这个问题看起来更漂亮-这只是为了说明。我还需要交叉申请@tmp不起作用,因为我上面有几行东西。我试过这个,但它不起作用。它标识一行中的所有ID,但为测试返回null。它不能工作,因为它只返回每个元素的n个ID。但是,每个元素都有y个列表元素!因此,返回的行数应该远远大于n!基本上,元素和ListElement之间有一个m-to-m realtionhsip-这是一个挑战,我希望这是有意义的。嗨。谢谢,看起来好多了。我当前正在尝试将:Parent.Node.nodes('/List/liselement')用作列表(List),而不是将Parent.Node.nodes('List/liselement')用作列表(List),因为后者不起作用。这似乎运行,但我仍在等待-它似乎需要时间…这运行45分钟。该表只包含一行20000个元素节点(最终将包含600行)。这不会花太长时间…@csetzkorn:再次更新我的答案-现在只使用一个优化的交叉应用