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

时间:2019-07-02 15:00:13

标签: sql-server xml tsql xquery xml-namespaces

我正在使用SQL Server上的XML数据。 (示例性)SQL如下所示:

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

该XML在一个表中可用,该表具有类型为<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

1 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

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

-XQuery函数namespace-uri()接受单例并返回其名称空间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; 

这将返回带有大量元数据的完整XML:

+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+
| 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                                     |
+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+