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

Bagaimana cara menghapus namespace yang berlebihan dalam kueri bersarang saat menggunakan FOR XML PATH

Setelah berjam-jam putus asa dan ratusan cobaan &kesalahan, saya menemukan solusi di bawah ini.

Saya memiliki masalah yang sama, ketika saya ingin hanya satu xmlns atribut, di root simpul hanya . Tetapi saya juga memiliki kueri yang sangat sulit dengan banyak subkueri dan FOR XML EXPLICIT metode saja terlalu rumit. Jadi ya, saya menginginkan kenyamanan FOR XML PATH di subkueri dan juga untuk mengatur xmlns saya sendiri .

Saya dengan hormat meminjam kode 8kb jawab, karena itu sangat bagus. Saya mengubahnya sedikit untuk pemahaman yang lebih baik. Ini kodenya:

DECLARE @Order TABLE (OrderID INT, OrderDate DATETIME)    
DECLARE @OrderDetail TABLE (OrderID INT, ItemID VARCHAR(1), Name VARCHAR(50), Qty INT)    
INSERT @Order VALUES (1, '2010-01-01'), (2, '2010-01-02')    
INSERT @OrderDetail VALUES (1, 'A', 'Drink',  5),
                           (1, 'B', 'Cup',    2),
                           (2, 'A', 'Drink',  2),
                           (2, 'C', 'Straw',  1),
                           (2, 'D', 'Napkin', 1)

-- Your ordinary FOR XML PATH query
DECLARE @xml XML = (SELECT OrderID AS "@OrderID",
                        (SELECT ItemID AS "@ItemID", 
                                Name AS "data()" 
                         FROM @OrderDetail 
                         WHERE OrderID = o.OrderID 
                         FOR XML PATH ('Item'), TYPE)
                    FROM @Order o 
                    FOR XML PATH ('Order'), ROOT('dummyTag'), TYPE)

-- Magic happens here!       
SELECT 1 AS Tag
      ,NULL AS Parent
      ,@xml AS [xml!1!!xmltext]
      ,'http://test.com/order' AS [xml!1!xmlns]
FOR XML EXPLICIT

Hasil:

<xml xmlns="http://test.com/order">
  <Order OrderID="1">
    <Item ItemID="A">Drink</Item>
    <Item ItemID="B">Cup</Item>
  </Order>
  <Order OrderID="2">
    <Item ItemID="A">Drink</Item>
    <Item ItemID="C">Straw</Item>
    <Item ItemID="D">Napkin</Item>
  </Order>
</xml>

Jika Anda memilih @xml saja, Anda akan melihat bahwa itu berisi simpul akar dummyTag . Kami tidak membutuhkannya, jadi kami menghapusnya dengan menggunakan direktif xmltext di FOR XML EXPLICIT permintaan:

,@xml AS [xml!1!!xmltext]

Meskipun penjelasan di MSDN terdengar lebih canggih, tetapi secara praktis ia memberitahu parser untuk memilih isi dari XML simpul akar.

Tidak yakin seberapa cepat kuerinya, namun saat ini saya sedang bersantai dan minum Scotch seperti seorang pria sambil melihat kode dengan tenang...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memilih indeks berkerumun di SQL Server?

  2. Hapus nomor dari string sql server

  3. Ketika prinsip KERING tidak berlaku:operasi BITWISE di SQL Server

  4. Periksa Surat Tidak Terkirim di SQL Server (T-SQL)

  5. Bagaimana membandingkan nilai Null dari kolom database