Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como posso consultar um valor em uma coluna XML no SQL Server 2008


Seus dados XML estão incompletos - eles usam um prefixo de namespace ns0 sem defini-lo em nenhum lugar... Eu adicionei algum namespace XML arbitrário e totalmente inventado aqui no meu exemplo - você precisa verificar o que esse namespace XML realmente é no seu caso e adaptar o exemplo de acordo!

Tente isto:
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)

Basicamente, você precisa ter uma definição para seu prefixo de namespace XML - e no SELECT em relação a esses dados XML, você precisa ter o mesmo namespace XML (mesmo que - como mostrado - o prefixo atribuído a esse namespace possa ser diferente - mas o namespace deve combinar!).

Isso seleciona os dados da tabela e, para os dados XML, usa o .nodes() Função XQuery para obter uma lista de elementos XML que correspondem a essa expressão XPath - e obtém esses nós como uma pseudotabela na memória XT com uma única coluna XML XC a partir do qual você pode buscar valores novamente (como alcançar o primeiro <ns:AStatus> elemento).