sql >> Databáze >  >> RDS >> Sqlserver

Jak mohu zadat dotaz na hodnotu ve sloupci XML v SQL Server 2008

Vaše data XML jsou neúplná – používají předponu jmenného prostoru ns0 aniž bych to kdekoli definoval... Přidal jsem sem do své ukázky nějaký libovolný, totálně vymyšlený jmenný prostor XML - musíte zkontrolovat, co ten jmenný prostor XML ve vašem případě vlastně je, a podle toho vzorek upravit!

Zkuste toto:

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)

V zásadě musíte mít definici pro předponu jmenného prostoru XML - a v SELECT oproti těmto XML datům musíte mít stejné Jmenný prostor XML (i když – jak je znázorněno – předpona přiřazená k tomuto jmennému prostoru se může lišit – ale jmenný prostor musí odpovídat!).

Poté vybere data z tabulky a pro data XML použije .nodes() Funkce XQuery pro získání seznamu prvků XML, které odpovídají tomuto výrazu XPath – a získá tyto uzly jako pseudo tabulku v paměti XT s jedním XML sloupcem XC ze kterého pak můžete znovu načíst hodnoty (například sáhnout do prvního <ns:AStatus> prvek).




  1. MySQL převést YEARWEEK na datum

  2. Oracle PL/SQL:odstranění mezer z řetězce

  3. hodnoty sloupců v řádku

  4. Jak mohu provést vakuování pomocí PostgreSQL?