[英]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_preparedocument
和sp_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.