Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso interrogare un valore in una colonna XML in SQL Server 2008

I tuoi dati XML sono incompleti:utilizza un prefisso dello spazio dei nomi ns0 senza definirlo da nessuna parte... Ho aggiunto uno spazio dei nomi XML arbitrario e totalmente inventato qui nel mio esempio:devi verificare quale sia effettivamente lo spazio dei nomi XML nel tuo caso e adattare il campione di conseguenza!

Prova questo:

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)

Fondamentalmente, devi avere una definizione per il prefisso dello spazio dei nomi XML - e nel SELECT rispetto a questi dati XML, devi avere lo stesso Spazio dei nomi XML (anche se, come mostrato, il prefisso assegnato a tale spazio dei nomi può essere diverso, ma lo spazio dei nomi deve corrispondere!).

Questo seleziona quindi i dati dalla tabella e, per i dati XML, utilizza .nodes() Funzione XQuery per ottenere un elenco di elementi XML che corrispondono a questa espressione XPath - e ottiene questi nodi come una pseudo tabella in memoria XT con una singola colonna XML XC da cui puoi quindi recuperare nuovamente i valori (come raggiungere il primo <ns:AStatus> elemento).