【问题标题】:Xquery to parse XML tags into columnsXquery 将 XML 标记解析为列
【发布时间】:2016-12-14 04:24:13
【问题描述】:

我有下面一段 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,而不是 policyStatusdetail。另外,PolicyStatus[1],而不是@PolicyStatus。使用您当前使用的内容,它将在 policystatusdetail 节点中查找属性“PolicyStatus”(例如,要查找“id”,您将使用@id)。
  • 嗨 Chaitanya,因为你是新来的(顺便说一句:欢迎!)请允许我一个提示:非常感谢你说 谢谢(你放了一个答案),但在(最佳)答案的投票计数器下方勾选接受检查会更友好。这将 1) 将此问题标记为已解决 2) 让追随者更容易找到最佳解决方案 3) 向回答者支付积分和 4) 向您支付积分。一旦您自己越过了 15 点边界,您还被要求对贡献进行投票。这是说谢谢的方式。编码快乐!

标签: sql sql-server xml tsql xpath


【解决方案1】:

有几个缺陷:

  • XML 严格区分大小写。你的/policyStatusdetail找不到找到&lt;policystatusdetail&gt;

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

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

  • 我们无法知道该节点是否仅出现一次。由于 XML 显然更大,它们可能会更多?

如果您真的只需要&lt;PolicyStatus&gt; 的第一次出现,这可以非常简单地完成:

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

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

【讨论】:

    【解决方案2】:

    试试这个:

     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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 2014-05-22
      • 2015-04-13
      相关资源
      最近更新 更多