首页 > 解决方案 > 存储过程读取带有命名空间的 xml 文件

问题描述

我正在尝试使用 SQL Server 2016 中的存储过程读取以下 xml。

DECLARE @xml as xml

SET @xml = '<ns:MT_FlexParams_SPICE xmlns:ns="urn:ptl.com:pi:imdl">
    <row>
        <ACCT>100043</ACCT>
        <BROL>10085437</BROLE>
        <STRTDAT>2019-11-01 00:00:00.0</STRTDAT>
        <ENDDAT>2021-05-15 00:00:00.0</ENDDAT>
        <DELDATE>1900-01-01 00:00:00.0</DELDATE>
        <DEF_ROLE> </DEF_ROLE>
        <BRASTA>10</BRASTA>
        <IRQID>10126</IRQID>
        <BRAUT_GRA> </BRAUT_GRA>
        <BRAUT_REV> </BRAUT_REV>
    </row>
    <row>
        <ACCT>100037</ACCT>
        <BROL>10085437</BROLE>
        <STRTDAT>2019-10-21 00:00:00.0</STRTDAT>
        <ENDDAT>2020-10-21 00:00:00.0</ENDDAT>
        <DELDATE>1900-01-01 00:00:00.0</DELDATE>
        <DEF_ROLE> </DEF_ROLE>
        <BRASTA>10</BRASTA>
        <IRQID>10106</IRQID>
        <BRAUT_GRA> </BRAUT_GRA>
        <BRAUT_REV> </BRAUT_REV>
    </row>
</ns:MT_FlexParams_SPICE>'

WITH XMLNAMESPACES (DEFAULT 'urn:ptl.com:pi:imdl') 
SELECT @xml.value('(row/ACCT)[1]', 'nvarchar(100)') as ACCT;

但它正在获取空结果。你能告诉我我正在执行的错误吗?

标签: sql-serverxmltsqlxqueryxml-namespaces

解决方案


XML 格式不正确,所以我必须修复它。

您需要使用.nodes()方法将 XML 分解为矩形结构。

SQL

DECLARE @xml AS XML = N'<ns:MT_FlexParams_SPICE xmlns:ns="urn:ptl.com:pi:imdl">
    <row>
        <ACCT>100043</ACCT>
        <BROL>10085437</BROL>
        <STRTDAT>2019-11-01 00:00:00.0</STRTDAT>
        <ENDDAT>2021-05-15 00:00:00.0</ENDDAT>
        <DELDATE>1900-01-01 00:00:00.0</DELDATE>
        <DEF_ROLE>
        </DEF_ROLE>
        <BRASTA>10</BRASTA>
        <IRQID>10126</IRQID>
        <BRAUT_GRA>
        </BRAUT_GRA>
        <BRAUT_REV>
        </BRAUT_REV>
    </row>
    <row>
        <ACCT>100037</ACCT>
        <BROL>10085437</BROL>
        <STRTDAT>2019-10-21 00:00:00.0</STRTDAT>
        <ENDDAT>2020-10-21 00:00:00.0</ENDDAT>
        <DELDATE>1900-01-01 00:00:00.0</DELDATE>
        <DEF_ROLE>
        </DEF_ROLE>
        <BRASTA>10</BRASTA>
        <IRQID>10106</IRQID>
        <BRAUT_GRA>
        </BRAUT_GRA>
        <BRAUT_REV>
        </BRAUT_REV>
    </row>
</ns:MT_FlexParams_SPICE>';

;WITH XMLNAMESPACES ('urn:ptl.com:pi:imdl' AS ns)
SELECT c.value('(ACCT/text())[1]', 'VARCHAR(100)') as ACCT
    , c.value('(BROL/text())[1]', 'VARCHAR(100)') as BROL
FROM @xml.nodes('/ns:MT_FlexParams_SPICE/row') AS t(c);

输出

+--------+----------+
|  ACCT  |   BROL   |
+--------+----------+
| 100043 | 10085437 |
| 100037 | 10085437 |
+--------+----------+

推荐阅读