Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment puis-je interroger une valeur dans une colonne XML dans SQL Server 2008

Vos données XML sont incomplètes - elles utilisent un préfixe d'espace de noms ns0 sans le définir nulle part... J'ai ajouté un espace de noms XML arbitraire et totalement inventé ici dans mon exemple - vous devez vérifier ce qu'est réellement cet espace de noms XML dans votre cas et adapter l'échantillon en conséquence !

Essayez ceci :

DECLARE @InputTable TABLE (ID INT NOT NULL, XmlData XML)

INSERT INTO @InputTable(ID, XmlData) VALUES(42, '<?xml version="1.0" encoding="UTF-8" ?>
<ns0:Root xmlns:ns0="urn:some-sample-xml-namespace">
    <ns0:Result>
        <ns0:AStatus>Aaa</ns0:AStatus>
        <ns0:BStatus>Bbb</ns0:BStatus>
    </ns0:Result>
</ns0:Root>')

-- define the XML namespace to use     
;WITH XMLNAMESPACES('urn:some-sample-xml-namespace' AS x)
SELECT 
    ID,
    XC.value('(x:AStatus)[1]', 'varchar(50)') 
FROM    
    @inputtable
CROSS APPLY
    -- get a "pseudo" table of nodes <ns0:Root>/<ns0:Result>
    XmlData.nodes('x:Root/x:Result') AS XT(XC)

Fondamentalement, vous devez avoir une définition pour votre préfixe d'espace de noms XML - et dans le SELECT contre ces données XML, vous devez avoir le même Espace de noms XML (même si - comme indiqué - le préfixe attribué à cet espace de noms peut être différent - mais l'espace de noms doit correspondre !).

Cela sélectionne ensuite les données de la table, et pour les données XML, il utilise le .nodes() Fonction XQuery pour obtenir une liste d'éléments XML qui correspondent à cette expression XPath - et elle obtient ces nœuds sous forme de pseudo-table en mémoire XT avec une seule colonne XML XC à partir duquel vous pouvez à nouveau récupérer des valeurs (comme atteindre le premier <ns:AStatus> élément).