通过 SQL 查询获取 XML 命名空间文本

Get XML namespace text via SQL query

我正在 SQL 服务器上处理 XML 数据。 (示例性的)SQL 如下所示:

<Document xmlns="urn:iso:std:iso:20022:some:test:xmlns">
  <Testnode>a</Testnode>
</Document>

XML 在 table 中可用,其中列名为 <fata,类型为 XML

我的问题是:如何创建一个 SELECT 查询来在一列中显示命名空间的文本?

预期的输出应该是:

+----------------------------------------+
| xmlns                                  |
+----------------------------------------+
| urn:iso:std:iso:20022:some:test:xmlns  |
+----------------------------------------+

结果列应该是一个字符串(没有XML)。

到目前为止我已经尝试过这个查询,但是结果是 NULL:

SELECT Data.value('(./Document)[1]','nvarchar(max)') AS xmlns
FROM xmltable

你可以试试这个:

DECLARE @xml XML=
N'<Document xmlns="urn:iso:std:iso:20022:some:test:xmlns">
  <Testnode>a</Testnode>
</Document>';

--XQuery-function namespace-uri() 取一个单例和returns 其命名空间uri

SELECT @xml.value('namespace-uri((/*:Document)[1])','nvarchar(max)');

由于 <Document> 元素存在于默认名称空间中,我们必须提前知道名称空间才能声明它。但是 - 幸运的是 - 我们可以将通配符与 *:.

一起使用

另一种选择 - 一种罕见的情况 - 是使用过时的 FROM OPENXML:

试试这个:

DECLARE @xml XML=
N'<Document xmlns="urn:iso:std:iso:20022:some:test:xmlns">
  <Testnode>a</Testnode>
</Document>';

DECLARE @docHandle INT;
EXEC sp_xml_preparedocument @docHandle OUTPUT, @xml;  
SELECT * FROM OPENXML (@docHandle, '/*',1);  
EXEC sp_xml_removedocument @docHandle; 

这个returns完整的XML还有很多meta-data:

+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+
| id | parentid | nodetype | localname | prefix | namespaceuri                          | datatype | prev | text                                  |
+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+
| 0  | NULL     | 1        | Document  | NULL   | urn:iso:std:iso:20022:some:test:xmlns | NULL     | NULL | NULL                                  |
+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+
| 2  | 0        | 2        | xmlns     | xmlns  | NULL                                  | NULL     | NULL | NULL                                  |
+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+
| 4  | 2        | 3        | #text     | NULL   | NULL                                  | NULL     | NULL | urn:iso:std:iso:20022:some:test:xmlns |
+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+
| 3  | 0        | 1        | Testnode  | NULL   | urn:iso:std:iso:20022:some:test:xmlns | NULL     | NULL | NULL                                  |
+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+
| 5  | 3        | 3        | #text     | NULL   | NULL                                  | NULL     | NULL | a                                     |
+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+