XQuery来解析XML标记为列
问题描述:
我有下面一段XML作为表XML列的一部分说MyTable的XQuery来解析XML标记为列
<policystatusdetail id="XXXXXXXXXXXXXXX">
<CurrentUser>ABCDEFG</CurrentUser>
<LastModifiedDateTime>2016-04-02T17:03:01.761</LastModifiedDateTime>
<PolicyStatus>Quote-New-Pending</PolicyStatus>
</policystatusdetail>
我想只提取PolicyStatus作为列。
我使用下面的查询
Select x.r.value('@PolicyStatus','varchar(500)') as PolicyStatus
from
(Select cast(XMLData as XML) XMLData from Mytable) s
cross apply s.XMLData.nodes('session/data/policyAdmin/policyStatusdetail') as x(r)
但它返回零行。谁能帮忙?
答
试试这个:
DECLARE @xml XML='<policystatusdetail id="XXXXXXXXXXXXXXX">
<CurrentUser>ABCDEFG</CurrentUser>
<LastModifiedDateTime>2016-04-02T17:03:01.761</LastModifiedDateTime>
<PolicyStatus>Quote-New-Pending</PolicyStatus>
</policystatusdetail><policystatusdetail id="XXXXXXXXXXXXXXX">
<CurrentUser>ABCDEFG</CurrentUser>
<LastModifiedDateTime>2016-04-02T17:03:01.761</LastModifiedDateTime>
<PolicyStatus>Quote-New-Pending</PolicyStatus>
</policystatusdetail>'
--Method 1.SELECT s.b.value('PolicyStatus[1]','varchar(500)') FROM @xml.nodes('policystatusdetail') s(b)
--Method 2.
SELECT s.b.value('.','varchar(500)') FROM @xml.nodes('policystatusdetail/PolicyStatus') s(b)
答
有几个缺陷:
XML是严格区分大小写。您
/policyStatusdetail
不能找到<policystatusdetail>
自己的查询显示,必须有更多:
.nodes('session/data/policyAdmin/policyStatusdetail')
的
CAST
使用(Select cast(XMLData as XML)
)所示,这个XML是 - 可能 - 存储内的非XML列。什么是实际的数据类型?我们无法知道,如果这个节点只有一个发生。由于XML显然更大,可能会有更多?
如果你真的需要别的比<PolicyStatus>
这第一次出现可以非常简单地完成:
SELECT CAST(XMLData AS XML).value('(//PolicyStatus)[1]','nvarchar(max)') AS PolicyStatus
FROM Mytable
的//
之初将触发深搜索,找到的第一个元素与给定的名称...
这可能是一个问题的情况。如果你的xml看起来像'policystatusdetail',你需要查找节点'policystatusdetail',而不是'policyStatusdetail'。此外,'PolicyStatus [1]',而不是'@ PolicyStatus'。使用您当前使用的内容,它将在policystatusdetail节点中查找属性“PolicyStatus”(例如,查找“id”,您将使用'@ id')。 – ZLK
嗨柴坦尼亚,因为你在这里很新(顺便说一句:欢迎!),请允许我一个提示:这是非常友好的你说*谢谢*(你给这个答案的答案),但它会更仁慈,在(最佳)答案的投票柜台下面打勾验收。这将1)标记此问题已解决2)使追随者更容易找到最佳解决方案3)支付点给答复者和4)支付点给你。一旦你自己超过了15分的边界,你又被要求对贡献进行投票。这是SO的方式来说声谢谢。快乐编码! – Shnugo