簡體   English   中英

如何使用包含不帶前綴的命名空間的 sp_xml_preparedocument 在 TSQL 中讀取 XML?

[英]How do I read XML in TSQL using sp_xml_preparedocument that includes a namespace without prefix?

我正在運行 SQL Server 2019 15.0.2095.3,我想讀取 XML 文件的內容,然后將其存儲到表中。 問題是我沒有收到任何錯誤,但是當 XML 包含不帶前綴的命名空間時結果集為空,但是一旦我刪除無前綴命名空間,它就會再次返回數據(它確實使用前綴)。

這是復制問題的代碼:

DECLARE @idoc INT, @doc VARCHAR(1000);   
SET @doc =' 
<ROOT xmlns="http://test.com">  
<Customers>  
   <Orders>  
      <nr>5</nr>
      <line>
        <test>55</test>
        <test2>444</test2>
      </line>
   </Orders>  
</Customers>  
<Customers>  
   <Orders>    
      <nr>4</nr>
      <line>
        <test>44</test>
        <test2>444</test2>
      </line>
   </Orders>  
</Customers>  
</ROOT>';   
  
--Create an internal representation of the XML document.  
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc, '<ROOT xmlns="http://test.com"/>  '
  
-- SELECT statement that uses the OPENXML rowset provider.  
    SELECT *
    FROM       OPENXML (@idoc, '/ROOT/Customers/Orders/nr' ) 

EXEC sp_xml_removedocument @idoc;  

當您刪除命名空間<ROOT xmlns="http://test.com">並只使用沒有它的元素時: <ROOT>它將返回一個正常的結果集。

但是我希望查詢返回內容而不更改 XML

保留 Microsoft 專有的OPENXML()及其伙伴sp_xml_preparedocumentsp_xml_removedocument只是為了與過時的 SQL Server 2000 向后兼容。它們的使用減少到很少的邊緣情況。

從 SQL Server 2005 開始,強烈建議重新編寫 SQL 並將其切換到 XQuery。 此外,OPENXML() 不能利用 XML 索引,而 XQuery 方法可以。

SQL

DECLARE @xml XML;   
SET @xml =
N'<ROOT xmlns="http://test.com">  
<Customers>  
   <Orders>  
      <nr>5</nr>
      <line>
        <test>55</test>
        <test2>444</test2>
      </line>
   </Orders>  
</Customers>  
<Customers>  
   <Orders>    
      <nr>4</nr>
      <line>
        <test>44</test>
        <test2>444</test2>
      </line>
   </Orders>  
</Customers>  
</ROOT>';   

;WITH XMLNAMESPACES(DEFAULT 'http://test.com')
SELECT c.value('(nr/text())[1]', 'INT') AS nr
    , c.value('(line/test/text())[1]', 'INT') AS test
    , c.value('(line/test2/text())[1]', 'INT') AS test2
FROM @xml.nodes('/ROOT/Customers/Orders') AS t(c);

輸出

+----+------+-------+
| nr | test | test2 |
+----+------+-------+
|  5 |   55 |   444 |
|  4 |   44 |   444 |
+----+------+-------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM