Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

sql query nilai xml mengembalikan NULL

xml Anda menyertakan namespace xmlns="http://www.webserviceX.NET/" , yang merupakan ruang nama default . Anda harus mendeklarasikannya atau menggunakan karakter pengganti untuk awalan.

Dengan XML ada beberapa praktik terbaik:

  • Bersikaplah sespesifik mungkin
  • Hanya navigasi maju
  • Penting Jika pembuatan XML berada di bawah kendali Anda, ubah format tanggal dan waktu menjadi ISO8601. Format Anda bersifat spesifik budaya dan dapat dengan mudah menyebabkan kesalahan konversi pada sistem yang berbeda. Yang terbaik adalah nilai gabungan seperti <DateAndTime>2017-05-23T12:37:00</DateAndTime>

Untuk masalah Anda, ada beberapa pendekatan:

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

--Pendekatan terbaik:XMLNAMESPACES untuk mendeklarasikan ruang nama default

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

--Deklarasi namespace implisit:

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

--Tidak direkomendasikan dalam banyak kasus, tapi bagus untuk orang malas :-D

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

--Jika Anda ingin membaca lebih banyak nilai pada level yang sama, Anda dapat menggunakan .nodes untuk mengatur simpul saat ini ke ...<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. SQL MEMILIH BARIS

  2. Bagaimana SQL Server menangani transaksi UPDATE?

  3. jika kondisi dalam permintaan pembaruan server sql

  4. Apa manfaat memiliki bidang varbinary dalam tabel 1-1 yang terpisah?

  5. Bagaimana cara membuat fungsi SQL Server untuk menggabungkan beberapa baris dari subquery ke dalam satu bidang yang dibatasi?