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

valores xml de consulta sql que devuelven NULL

Su xml incluye un espacio de nombres xmlns="http://www.webserviceX.NET/" , que es el espacio de nombres predeterminado . Debe declararlo o usar un comodín para el prefijo.

Con XML existen algunas prácticas recomendadas:

  • Se lo más específico posible
  • Solo navegación hacia adelante
  • Importante Si la creación del XML está bajo su control, cambie el formato de fecha y hora a ISO8601. Sus formatos son específicos de la cultura y pueden conducir fácilmente a errores de conversión en diferentes sistemas. Mejor fue un valor combinado como <DateAndTime>2017-05-23T12:37:00</DateAndTime>

Para su problema hay varios enfoques:

DECLARE @xml XML=
N'<string xmlns="http://www.webserviceX.NET/">
  <StockQuotes>
    <Stock>
      <Symbol>ENGI.PA</Symbol>
      <Last>13.53</Last>
      <Date>5/23/2017</Date>
      <Time>12:37pm</Time>
      <!--more elements -->
    </Stock>
  </StockQuotes>
</string>';

--Mejor enfoque:XMLNAMESPACES para declarar el espacio de nombres predeterminado

WITH XMLNAMESPACES(DEFAULT 'http://www.webserviceX.NET/')
SELECT @xml.value(N'(/string/StockQuotes/Stock/Symbol/text())[1]',N'nvarchar(max)');

--Declaración de espacio de nombres implícita:

SELECT @xml.value(N'declare namespace ns="http://www.webserviceX.NET/";
                   (/ns:string/ns:StockQuotes/ns:Stock/ns:Symbol/text())[1]',N'nvarchar(max)');

--No recomendado en la mayoría de los casos, pero bueno para personas perezosas :-D

SELECT @xml.value(N'(//*:Symbol)[1]',N'nvarchar(max)');

--Si desea leer más valores del mismo nivel, puede usar .nodes para establecer el nodo actual en ...<Stock> .

WITH XMLNAMESPACES(DEFAULT 'http://www.webserviceX.NET/')
SELECT st.value('(Symbol/text())[1]',N'nvarchar(max)')
      ,st.value('(Last/text())[1]',N'decimal(10,4)')
      --more nodes 
FROM @xml.nodes(N'/string/StockQuotes/Stock') AS A(st);