Sql Xquery将XML标记解析为列
下面是一段XML,作为表SAYMyTable中XML列的一部分Sql Xquery将XML标记解析为列,sql,sql-server,xml,tsql,xpath,Sql,Sql Server,Xml,Tsql,Xpath,下面是一段XML,作为表SAYMyTable中XML列的一部分 <policystatusdetail id="XXXXXXXXXXXXXXX"> <CurrentUser>ABCDEFG</CurrentUser> <LastModifiedDateTime>2016-04-02T17:03:01.761</LastModifiedDateTime> <PolicyStatus>Quote-New-Pending</
<policystatusdetail id="XXXXXXXXXXXXXXX">
<CurrentUser>ABCDEFG</CurrentUser>
<LastModifiedDateTime>2016-04-02T17:03:01.761</LastModifiedDateTime>
<PolicyStatus>Quote-New-Pending</PolicyStatus>
</policystatusdetail>
但它返回零行。有人能帮忙吗?试试这个:
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)
DECLARE@xml='xml'
ABCDEFG
2016-04-02T17:03:01.761
新报价待定
ABCDEFG
2016-04-02T17:03:01.761
新报价待定
'
--方法1.从@xml.nodes('policystatusdetail')s(b)中选择s.b.value('PolicyStatus[1]”,'varchar(500'))
--方法2。
从@xml.nodes('policystatusdetail/PolicyStatus')的(b)中选择s.b.value('.','varchar(500)')
有几个缺陷:
- XML严格区分大小写。您的
无法找到/policyStatusdetail
- 您自己的查询显示,必须有更多节点:
.nodes('session/data/policyAdmin/policyStatusdetail')
- 您使用的
(CAST
)显示,此XML可能存储在非XML列中。实际的数据类型是什么selectcast(xmldataasxml)
- 我们不知道这个节点是否只发生一次。由于XML更大,显然可能会有更多的XML
,那么可以非常简单地做到这一点:
SELECT CAST(XMLData AS XML).value('(//PolicyStatus)[1]','nvarchar(max)') AS PolicyStatus
FROM Mytable
开头的
/
将触发深度搜索并找到具有给定名称的第一个元素…这可能是case的问题。如果xml看起来像policystatusdetail
,则需要查找节点policystatusdetail
,而不是policystatusdetail
。另外,PolicyStatus[1]
,而不是@PolicyStatus
。使用您当前使用的内容,它将在policystatusdetail节点中查找属性“PolicyStatus”(例如,要查找“id”,您将使用@id
)。您好,柴坦尼亚,因为您是新来的(顺便说一句:欢迎!)请允许我一个提示:非常感谢您(您为此给出了答案),但这会更加友好,在(最佳)答案的投票计数器下方勾选接受检查。这将1)将此问题标记为已解决2)使追随者更容易找到最佳解决方案3)向回答者支付积分,4)向您支付积分。一旦你自己越过了15点的边界,你会被要求对捐款进行投票。这就是说谢谢的方式。快乐编码!
SELECT CAST(XMLData AS XML).value('(//PolicyStatus)[1]','nvarchar(max)') AS PolicyStatus
FROM Mytable