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) 

但它返回零行。谁能帮忙?

+0

这可能是一个问题的情况。如果你的xml看起来像'policystatusdetail',你需要查找节点'policystatusdetail',而不是'policyStatusdetail'。此外,'PolicyStatus [1]',而不是'@ PolicyStatus'。使用您当前使用的内容,它将在policystatusdetail节点中查找属性“PolicyStatus”(例如,查找“id”,您将使用'@ id')。 – ZLK

+0

嗨柴坦尼亚,因为你在这里很新(顺便说一句:欢迎!),请允许我一个提示:这是非常友好的你说*谢谢*(你给这个答案的答案),但它会更仁慈,在(最佳)答案的投票柜台下面打勾验收。这将1)标记此问题已解决2)使追随者更容易找到最佳解决方案3)支付点给答复者和4)支付点给你。一旦你自己超过了15分的边界,你又被要求对贡献进行投票。这是SO的方式来说声谢谢。快乐编码! – Shnugo

试试这个:

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 

//之初将触发深搜索,找到的第一个元素与给定的名称...