sql >> Databáze >  >> RDS >> Sqlserver

sql dotaz xml hodnoty vracející NULL

Váš XML obsahuje jmenný prostor xmlns="http://www.webserviceX.NET/" , což je výchozí jmenný prostor . Musíte jej buď deklarovat, nebo jako předponu použít zástupný znak.

S XML existuje několik osvědčených postupů:

  • Buďte co nejkonkrétnější
  • Pouze dopředná navigace
  • Důležité Pokud je vytváření XML pod vaší kontrolou, změňte formát data a času na ISO8601. Vaše formáty jsou specifické pro kulturu a mohou snadno vést k chybám převodu na různých systémech. Nejlepší byla kombinovaná hodnota jako <DateAndTime>2017-05-23T12:37:00</DateAndTime>

K vašemu problému existuje několik přístupů:

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

--Nejlepší přístup:XMLNAMESPACES deklarovat výchozí jmenný prostor

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

--Implicitní deklarace jmenného prostoru:

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

--Ve většině případů se nedoporučuje, ale je dobré pro líné lidi :-D

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

--Pokud chcete načíst více hodnot stejné úrovně, můžete použít .nodes pro nastavení aktuálního uzlu na ...<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. Jak používat tabulku čísel ve výpisu SELECT INTO

  2. Použití příkazu IN pro parametr SQL uložené procedury

  3. Zabránit sequelizaci zahodit databázi v aplikaci node.js

  4. Určete verzi propojeného serveru SQL Server