粉碎xml列

时间:2010-04-19 08:37:38

标签: sql sql-server-2005 xquery

我有一个包含这样的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值)。

感谢。

祝福,

基督教

2 个答案:

答案 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>
相关问题