2017-07-25 112 views
1

我一直在尋找解決方案來解決我的問題。其實我想從XML列中檢索一些數據。 下面是數據:TSQL使用名稱空間查詢xml

<Notification xmlns="http://model.company/notification/de/v1" 
    dateNotification="2017-07-24T11:47:51.012+02:00" 
    identifiant="4b7330c7-021f-4cf9-ace6-f74d73f409ef" 
    personneId="1071249" 
    source="REGLES" 
    sourceVersion="1.0.17" 
    typeMouvement="MODIFICATION"> 
     <EvenementDE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      referenceOriginale="1071249" 
      xsi:type="ChangementSignaletique"> 
       <Champ 
        ancienneValeur="Doe" 
        nom="nom" 
        nouvelleValeur="DOE" /> 
     </EvenementDE> 
     <EvenementDE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      referenceOriginale="1071249" 
      xsi:type="ChangementSignaletique"> 
       <Champ 
        ancienneValeur="John" 
        nom="prenom" 
        nouvelleValeur="John Carl" /> 
     </EvenementDE> 
</Notification> 

我想找回 「ancienneValeur」, 「nouvelleValeur」 特定 「referenceOriginale」。 以下是提琴手:Fiddler 從根中獲取屬性很容易,但無法從Champ獲取屬性。

我希望有人能幫助我。 在此先感謝。

回答

1

您必須使用適當的XPath作爲您希望查詢/呈現的元素和屬性。

DECLARE @xml XML = N'... your xml...';  

WITH XMLNAMESPACES (DEFAULT 'http://model.company/notification/de/v1') 
SELECT 
    N.N.value('./Champ[1]/@ancienneValeur', 'NVARCHAR(100)') AS [ancienneValeur] 
FROM @xml.nodes('/Notification/EvenementDE') As N(N) 
WHERE N.N.value('./@referenceOriginale', 'INT') = 1071249 

...結果...

ancienneValeur 
Doe 
John 
+1

特別是隨着大個XML倒不如包括了'WHERE'爲*謂詞*成'.nodes()'的'的XQuery '。類似'.nodes('/ Notification/EvenementDE [@ ReferenceOriginale = 1071249]')'。如果需要,可以使用'sql:variable()'或'sql:column()'引入硬編碼值。 – Shnugo

+0

好點。 '.exist(...)'函數也快於'.value(...)'和'.query(...)' –

+0

真的,這取決於你在尋找什麼... – Shnugo