sql >> Database teknologi >  >> RDS >> Sqlserver

sql-forespørgsel xml-værdier, der returnerer NULL

Din xml indeholder et navneområde xmlns="http://www.webserviceX.NET/" , som er standardnavneområdet . Du skal enten erklære det eller bruge et jokertegn for præfikset.

Med XML er der nogle bedste fremgangsmåder:

  • Vær så specifik som muligt
  • Kun fremadgående navigation
  • Vigtigt Hvis oprettelsen af ​​XML er under din kontrol, skal du ændre dato- og tidsformatet til ISO8601. Dine formater er kulturspecifikke og kan nemt føre til konverteringsfejl på forskellige systemer. Bedst var en kombineret værdi som 2017-05-23T12:37:00

Til dit problem er der flere tilgange:

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>';

--Bedste fremgangsmåde:XMLNAMESPACES for at erklære standardnavneområdet

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

--Implicit navneområdeerklæring:

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

--Ikke anbefalet i de fleste tilfælde, men god til dovne mennesker :-D

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

--Hvis du vil læse flere værdier på samme niveau, kan du bruge .nodes for at indstille den aktuelle node til ... .

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);


  1. Sådan forbinder du to ikke-relaterede tabeller i sql

  2. Kan ikke oprette forbindelse til mysql med 127.0.0.1

  3. Sådan forbinder du to tabeller fra forskellige databaser

  4. Hvad betyder ORDER BY (SELECT NULL)?