SQL Server - 返回 xml 列的 xml 子节点

Posted

技术标签:

【中文标题】SQL Server - 返回 xml 列的 xml 子节点【英文标题】:SQL Server - returning xml child nodes for xml column 【发布时间】:2012-09-23 07:55:22 【问题描述】:

给定带有列的表 T:

ID UNIQUEIDENTIFIER
CreatedDate DATETIME
XmlData XML

XmlData 的结构如下:

<application>
    <details firstname="first" lastname="last">
        <statement>statement</statement>
    </details>
    <educationHistory>
        <education subject="subject1" />
        <education subject="subject2" />
    </educationHistory>
    <experienceHistory>
        <examiningExperienceHistory>
            <examiningExperience module="module1" />
            <examiningExperience module="module2" />
        </examiningExperienceHistory>
        <teachingExperienceHistory>
            <teachingExperience module="module1" />
            <teachingExperience module="module2" />
        </teachingExperienceHistory>
    </experienceHistory>
</application>

我需要像这样返回一个摘录:

ID Date       FirstName LastName Education    ExaminingExp TeachingExp
-----------------------------------------------------------------------
1  02-10-2012 First     Last     <xmlextract> <xmlextract> <xmlextract>

到目前为止我有:

SELECT ID,
       CreatedDate [Date],
       XmlData.value('(application/details/@firstname)[1]','varchar(max)') [FirstName],
       XmlData.value('(application/details/@lastname)[1]','varchar(max)') [LastName]
FROM T

我在最后三栏为你挣扎。对于每条记录,我需要列出教学/考试经验和教育。有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

试试这个:

SELECT ID, Created [DATE] 
XmlData.value('(application/details/@firstname)[1]','varchar(max)') [FirstName],
XmlData.value('(application/details/@lastname)[1]','varchar(max)') [LastName],
XmlData.query('/application/educationHistory'),
XmlData.query('/application/experienceHistory/examiningExperienceHistory'),
XmlData.query('/application/experienceHistory/teachingExperienceHistory')
FROM T

【讨论】:

【参考方案2】:

使用.query提取xml。

例如

select 
XmlData.query('/application/educationHistory/*'),
XmlData.query('/application/experienceHistory/examiningExperienceHistory/*'),
XmlData.query('/application/experienceHistory/teachingExperienceHistory/*')

【讨论】:

这太好了,谢谢。只是为了厚脸皮,有没有办法可以限制查询中返回的内容?例如而不是返回路径下的完整 xml,只返回某些属性。所以给定&lt;education subject="subject1" grade="grade" /&gt;,只返回&lt;education subject="subject1" /&gt; 你可以通过xmldata.query ('data(/application/educationHistory/education/@subject)')获取主题属性的值 @podiluska 不是使用 query(),而是使用 value()。 可以过滤想要返回的节点。 IE。 @xmlVar.query('/application/educationHistory/education[@subject="subject1"]'),但不能过滤返回的属性。返回节点中的每个属性都会被返回 @podiluska 真的,对不起,我误解了你的评论。这将返回该 XQuery 路径下所有节点中该属性的值。

以上是关于SQL Server - 返回 xml 列的 xml 子节点的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rS:解析来自具有 XML 列的 SQL Server 查询的结果

如何读取 FOR XML SQL Server 查询的完整结果?

奇怪的“返回的数据与列的预期数据长度不匹配”错误,而预期长度要大得多 - SQL SERVER 2012

SQL Server 返回xml数据

从SQL Server的XML数据类型字段中提取数据

Sql Server XML 列替代 Document DB?