TSQL使用命名空间查询xml

时间:2017-07-25 14:06:51

标签: sql-server 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>

我想为特定的“referenceOriginale”检索“ancienneValeur”,“nouvelleValeur”。 这是小提琴手:Fiddler 从根获取属性很容易,但无法从Champ获得属性。

我希望有人可以帮助我。 提前谢谢。

1 个答案:

答案 0 :(得分: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