TSQL使用名称空间查询xml

问题描述:

我一直在寻找解决方案来解决我的问题。其实我想从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获取属性。

我希望有人能帮助我。 在此先感谢。

您必须使用适当的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