Sql 分解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

我有一个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>
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:再次更新我的答案-现在只使用一个优化的交叉应用