我将下面的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)
但它返回零行。有人可以帮忙吗?
答案 0 :(得分:2)
有几个缺陷:
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
开头的//
会触发深度搜索并找到具有给定名称的第一个元素...
答案 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)