Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

wartości xml zapytania sql zwracają wartość NULL

Twój plik xml zawiera przestrzeń nazw xmlns="http://www.webserviceX.NET/" , czyli domyślna przestrzeń nazw . Musisz go zadeklarować lub użyć symbolu wieloznacznego jako prefiksu.

W przypadku XML istnieje kilka najlepszych praktyk:

  • Bądź jak najbardziej konkretny
  • Tylko nawigacja do przodu
  • Ważne Jeśli tworzenie XML jest pod Twoją kontrolą, zmień format daty i godziny na ISO8601. Twoje formaty są specyficzne dla kultury i mogą łatwo prowadzić do błędów konwersji w różnych systemach. Najlepsza była połączona wartość, taka jak <DateAndTime>2017-05-23T12:37:00</DateAndTime>

W przypadku Twojego problemu istnieje kilka podejść:

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

--Najlepsze podejście:XMLNAMESPACES zadeklarować domyślną przestrzeń nazw

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

--Niejawna deklaracja przestrzeni nazw:

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

--W większości przypadków niezalecane, ale dobre dla leniwych :-D

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

--Jeśli chcesz przeczytać więcej wartości tego samego poziomu, możesz użyć .nodes aby ustawić bieżący węzeł 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wygenerować skrypty sql server 2012 w sql server 2008 r2?

  2. Jak znaleźć nieużywane tabele w SQL Server

  3. Pobierz dane z procedury składowanej, która ma wiele zestawów wyników

  4. Czy Entity Framework obsługuje ApplicationIntent=Tylko do odczytu w parametrach połączenia SQLClient?

  5. Zapytanie transpozycji tworzy węzły (SQL Server 2008)