【问题标题】:TSQL querying xml with namespaceTSQL 使用命名空间查询 xml
【发布时间】:2017-07-25 14:06:51
【问题描述】:

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

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

【问题讨论】:

    标签: sql-server xml tsql


    【解决方案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
    

    【讨论】:

    • 特别是对于较大的 XML,最好将 WHERE 作为 谓词 包含到 .nodes()XQuery 中。类似于.nodes('/Notification/EvenementDE[@ReferenceOriginale=1071249]')。如果需要,可以使用sql:variable()sql:column() 引入硬编码值。
    • 好点。 .exist(...) 函数也比 .value(...).query(...) 更快
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 2019-04-27
    • 1970-01-01
    相关资源
    最近更新 更多