sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag fråga ett värde i en XML-kolumn i SQL Server 2008

Din XML-data är ofullständig - den använder ett namnområdesprefix ns0 utan att definiera det någonstans... Jag har lagt till ett godtyckligt, helt påhittat XML-namnområde här i mitt exempel - du måste kontrollera vad det där XML-namnområdet faktiskt är i ditt fall och anpassa exemplet därefter!

Prova detta:

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)

I grund och botten måste du ha en definition för ditt XML-namnområdesprefix - och i SELECT mot denna XML-data måste du ha samma XML-namnrymden (även om - som visas - prefixet som tilldelas namnutrymmet kan vara annorlunda - men namnutrymmet måste matcha!).

Detta väljer sedan data från tabellen och för XML-data använder den .nodes() XQuery-funktion för att få en lista över XML-element som matchar detta XPath-uttryck - och den får dessa noder som en pseudotabell i minnet XT med en enda XML-kolumn XC från vilken du sedan igen kan hämta värden (som att nå in i den första <ns:AStatus> element).




  1. Jämför datum lagrade som sträng med Datetime

  2. När jag kör programmet skapar JPA inte tabell i MySQL

  3. Frågar understrängar mot en lista med värden

  4. Förhindrar att frågor cachelagras i MySQL