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,只返回某些属性。所以给定<education subject="subject1" grade="grade" />
,只返回<education subject="subject1" />
,
你可以通过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 查询的完整结果?