Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich einen Wert in einer XML-Spalte in SQL Server 2008 abfragen

Ihre XML-Daten sind unvollständig – sie verwenden ein Namespace-Präfix ns0 ohne ihn irgendwo zu definieren... Ich habe hier in meinem Beispiel einen willkürlichen, vollständig erfundenen XML-Namensraum hinzugefügt - Sie müssen überprüfen, was dieser XML-Namensraum in Ihrem Fall tatsächlich ist, und das Beispiel entsprechend anpassen!

Versuchen Sie Folgendes:

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)

Grundsätzlich brauchen Sie eine Definition für Ihr XML-Namespace-Präfix - und im SELECT gegen diese XML-Daten müssen Sie dasselbe haben XML-Namespace (obwohl - wie gezeigt - das diesem Namespace zugewiesene Präfix unterschiedlich sein kann - aber der Namespace muss übereinstimmen!).

Dieser wählt dann die Daten aus der Tabelle aus und verwendet für die XML-Daten den .nodes() XQuery-Funktion zum Abrufen einer Liste von XML-Elementen, die mit diesem XPath-Ausdruck übereinstimmen – und erhält diese Knoten als In-Memory-Pseudotabelle XT mit einer einzigen XML-Spalte XC aus der man dann wieder Werte holen kann (wie in die erste <ns:AStatus> Element).