通过 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 |
+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+
我正在 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 |
+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+