存储过程使用命名空间读取 xml 文件
Stored procedure Read xml file with namespaces
我正在尝试使用 SQL 服务器 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;
但它正在获取空结果。你能告诉我我正在执行的错误吗?
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);
Output
+--------+----------+
| ACCT | BROL |
+--------+----------+
| 100043 | 10085437 |
| 100037 | 10085437 |
+--------+----------+
我正在尝试使用 SQL 服务器 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;
但它正在获取空结果。你能告诉我我正在执行的错误吗?
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);
Output
+--------+----------+
| ACCT | BROL |
+--------+----------+
| 100043 | 10085437 |
| 100037 | 10085437 |
+--------+----------+