sql >> Databasteknik >  >> RDS >> Sqlserver

sql-fråga xml-värden som returnerar NULL

Din xml innehåller ett namnområde xmlns="http://www.webserviceX.NET/" , som är standardnamnutrymmet . Du måste antingen deklarera det eller använda ett jokertecken för prefixet.

Med XML finns det några bästa metoder:

  • Var så specifik som möjligt
  • Endast navigering framåt
  • Viktigt Om skapandet av XML är under din kontroll ändra datum- och tidsformatet till ISO8601. Dina format är kulturspecifika och kan lätt leda till konverteringsfel på olika system. Bäst var ett kombinerat värde som 2017-05-23T12:37:00

För ditt problem finns det flera tillvägagångssätt:

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

--Bästa tillvägagångssätt:XMLNAMESPACES för att deklarera standardnamnutrymmet

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

--Implicit namnområdesdeklaration:

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

--Rekommenderas inte i de flesta fall, men bra för lata människor :-D

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

--Om du vill läsa fler värden på samma nivå kan du använda .nodes för att ställa in den aktuella noden till ... .

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. Vad är det maximala antalet tecken som nvarchar(MAX) rymmer?

  2. Spring Data Rest:Datum är null-fråga ger ett postgres-undantag

  3. Oracle drivrutin minnesläcka - Tomcat

  4. Kontrollera om kopplingen existerar utan att det uppstår en databasträff