我正在使用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
答案 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 |
+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+