sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo puedo consultar un valor en una columna XML en SQL Server 2008?

Sus datos XML están incompletos:utiliza un prefijo de espacio de nombres ns0 sin definirlo en ninguna parte... He agregado un espacio de nombres XML arbitrario y totalmente inventado aquí en mi muestra:¡debe verificar cuál es realmente ese espacio de nombres XML en su caso y adaptar la muestra en consecuencia!

Prueba esto:

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)

Básicamente, necesitas tener una definición para su prefijo de espacio de nombres XML - y en SELECT contra estos datos XML, debe tener el mismo espacio de nombres XML (aunque, como se muestra, el prefijo asignado a ese espacio de nombres puede ser diferente, pero el espacio de nombres debe coincidir!).

Esto luego selecciona los datos de la tabla, y para los datos XML, usa .nodes() Función XQuery para obtener una lista de elementos XML que coinciden con esta expresión XPath, y obtiene estos nodos como una pseudo tabla en memoria XT con una sola columna XML XC desde donde puede obtener valores nuevamente (como alcanzar el primer <ns:AStatus> elemento).