Xquery将XML标记解析为列

时间:2016-12-14 04:24:13

标签: sql sql-server xml tsql xpath

我将下面的XML作为表格中的XML列的一部分说MyTable

<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)

但它返回零行。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

有几个缺陷:

  • XML严格区分大小写。您的/policyStatusdetail 无法找到<policystatusdetail>

  • 您自己的查询显示,必须有更多:.nodes('session/data/policyAdmin/policyStatusdetail')

  • 您使用的CASTSelect cast(XMLData as XML))表明,此XML可能存储在非XML列中。实际数据类型是什么?

  • 我们无法知道,如果此节点只出现一次。由于XML显然更大,可能会有更多?

如果你真的只需要<PolicyStatus>的第一次出现,那么这可以非常简单地完成:

SELECT CAST(XMLData AS XML).value('(//PolicyStatus)[1]','nvarchar(max)') AS PolicyStatus
FROM Mytable

开头的//会触发深度搜索并找到具有给定名称的第一个元素...

答案 1 :(得分:0)

试试这个:

 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)