我有下面的 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)
但它返回零行。有人可以帮忙吗?
最佳答案
有几个缺陷:
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
//
开头将触发深度搜索并找到具有给定名称的第一个元素...
关于sql - Xquery 将 XML 标签解析为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41134816/