分解 xml 列

发布于 2024-08-29 01:23:47 字数 1226 浏览 9 评论 0原文

我有一个 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)

但我还没有实现保留“外国” key'(ID 值)。

谢谢。

最好的祝愿,

克里斯蒂安

I have a XML column which contains XML like this:

<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>

I would like to shred this into a relation table containing this:

ID, ListElement
1, ListElement1
1, ListElement2
2, ListElement3
2, ListElement4

I am able to obtain the content of the Parts using something like this:

select      
    List.value('(Part1/text())[1]', 'varchar(max)') as test
from 
    Table CROSS APPLY 
      xml.nodes('// Element/List/ListElement') AS List(List)

but I have not yet achieved to keep the ‘foreign key’ (the ID value).

Thanks.

Best wishes,

Christian

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

开始看清了 2024-09-05 01:23:47

尝试这个而不是您的查询:

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 xpath 是出了名的慢)

Try this instead of your query:

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)

Updated again - now back to only one CROSS APPLY, reaching back up into the grand parent's "ID" element using ../../ID in XPath. Also eliminated the //Element XPath in favour of /Set/Element (the //Element xpaths are notoriously slow)

牵你的手,一向走下去 2024-09-05 01:23:47

如果有人想使用 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>

In case anyone wants to do this with XQuery:


<Table>
   {for $listElement in $table//ListElement
    return
      <Row>
        {$listElement/../../ID}
        {$listElement/Part1}
      </Row>    
   }
</Table>

where $table is the original XML

returns

<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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文