2016-12-14 103 views
2

我有下面一段XML作爲表XML列的一部分說MyTable的XQuery來解析XML標記爲列

<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

這可能是一個問題的情況。如果你的xml看起來像'policystatusdetail',你需要查找節點'policystatusdetail',而不是'policyStatusdetail'。此外,'PolicyStatus [1]',而不是'@ PolicyStatus'。使用您當前使用的內容,它將在policystatusdetail節點中查找屬性「PolicyStatus」(例如,查找「id」,您將使用'@ id')。 – ZLK

+0

嗨柴坦尼亞,因爲你在這裏很新(順便說一句:歡迎!),請允許我一個提示:這是非常友好的你說*謝謝*(你給這個答案的答案),但它會更仁慈,在(最佳)答案的投票櫃檯下面打勾驗收。這將1)標記此問題已解決2)使追隨者更容易找到最佳解決方案3)支付點給答覆者和4)支付點給你。一旦你自己超過了15分的邊界,你又被要求對貢獻進行投票。這是SO的方式來說聲謝謝。快樂編碼! – Shnugo

回答

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

//之初將觸發深搜索,找到的第一個元素與給定的名稱...