如何在SQL中使用XPath提取XML节点时保留节点关联关系?
要保留Title和Author的关联关系,核心是先定位到每个//路径。
正确查询语句
SELECT bookNode.value('(Title/text())[1]', 'VARCHAR(100)') AS Title, bookNode.value('(Author/text())[1]', 'VARCHAR(100)') AS Author FROM [dbo].[Books] CROSS APPLY [XML].nodes('//Books/Book') AS BooksNodes(bookNode)
为什么之前的方法不行?
- 两次CROSS APPLY分别提取Title和Author:相当于把所有Title和所有Author做笛卡尔积,自然会打乱关联关系,因为没有绑定到同一个
父节点。 - 定位到
后用 //Title提取://是全局搜索,会返回整个XML文档中第一个Title的值,而不是当前节点下的子节点,所以会重复数据。
额外说明
- 如果你的XML中
<Books>是根节点,路径可以写成'/Books/Book',比//Books/Book更精准,避免匹配文档中其他位置的同名节点。 - 使用
(Title/text())[1]而不是直接Title/text(),是为了确保只取第一个文本节点,避免因XML中存在多个文本片段(比如节点内有换行或注释)导致返回拼接后的异常值。
内容的提问来源于stack exchange,提问作者SQLNoob
相关产品推荐
相关产品推荐

