sql >> Database >  >> RDS >> Sqlserver

sql query xml-waarden die NULL retourneren

Uw xml bevat een naamruimte xmlns="http://www.webserviceX.NET/" , de standaard naamruimte . Je moet het ofwel declareren of een jokerteken gebruiken voor het voorvoegsel.

Met XML zijn er enkele best practices:

  • Wees zo specifiek mogelijk
  • Alleen voorwaartse navigatie
  • Belangrijk Als u de aanmaak van de XML onder uw controle heeft, wijzigt u de datum- en tijdnotatie in ISO8601. Je formats zijn cultuurspecifiek en kunnen gemakkelijk leiden tot conversiefouten op verschillende systemen. Het beste was een gecombineerde waarde zoals <DateAndTime>2017-05-23T12:37:00</DateAndTime>

Voor uw probleem zijn er verschillende benaderingen:

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

--Beste aanpak:XMLNAMESPACES om de standaard naamruimte te declareren

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

--Impliciete naamruimtedeclaratie:

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

--In de meeste gevallen niet aanbevolen, maar goed voor luie mensen :-D

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

--Als u meer waarden van hetzelfde niveau wilt lezen, kunt u .nodes . gebruiken om het huidige knooppunt in te stellen op ...<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);


  1. Hoe het PHP-script op geplande tijd uit te voeren

  2. Is er een lijstgegevenstype in opgeslagen MySQL-procedures of een manier om ze te emuleren?

  3. Zoek naar string in tekstkolom in MySQL

  4. MySQL-gegevensbestand krimpt niet