Sql server 使用名称空间查询xml的TSQL

Sql server 使用名称空间查询xml的TSQL,sql-server,xml,tsql,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" so

我一直在寻找解决我问题的办法。实际上,我想从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>

我想检索“旧版本”、“新版本”作为一个特定的“参考原始版本”。 这是小提琴手: 从根目录获取属性很容易,但无法从Champ获取属性

我希望有人能帮助我。 提前感谢。

对于要查询/显示的元素和属性,必须使用适当的

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

尤其是对于较大的XML,最好将
WHERE
作为谓词包含到
.nodes()
XQuery
中。类似于
.nodes('/Notification/EvenementDE[@ReferenceOriginale=1071249]')
。如果需要,可以使用
sql:variable()
sql:column()
引入硬编码值。这一点很好。
.exist(…)
函数也比
.value(…)
.query(…)