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

Hvordan kan jeg forespørge på en værdi i en XML-kolonne i SQL Server 2008

Dine XML-data er ufuldstændige - de bruger et navneområdepræfiks ns0 uden at definere det nogen steder... Jeg har tilføjet nogle vilkårlige, totalt opbyggede XML-navnerum her i mit eksempel - du skal tjekke, hvad det XML-navneområde faktisk er i dit tilfælde og tilpasse eksemplet i overensstemmelse hermed!

Prøv dette:

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)

Grundlæggende skal du have en definition for dit XML-navneområde-præfiks - og i SELECT mod disse XML-data skal du have det samme XML-navneområde (selvom - som vist - præfikset tildelt det navneområde kan være anderledes - men navnerummet skal matche!).

Dette vælger derefter dataene fra tabellen, og for XML-dataene bruger det .nodes() XQuery-funktion for at få en liste over XML-elementer, der matcher dette XPath-udtryk - og den får disse noder som en pseudo-tabel i hukommelsen XT med en enkelt XML-kolonne XC hvorfra du så igen kan hente værdier (som at nå ind i den første <ns:AStatus> element).




  1. Hvordan forhindrer man automatisk nedlukning af SQL Server LocalDB?

  2. Automatisk dataversionering i MariaDB Server 10.3

  3. Hvordan udløser man mysql-begivenhed efter en tidsperiode?

  4. Regex for at matche MySQL-kommentarer