SQL查询带epcis、dts命名空间的XML转数据表报错如何解决
解决方案
报错的核心原因是SQL Server执行XML XQuery时,必须显式声明XML中用到的命名空间,才能在查询路径中使用对应的前缀。你只需要在查询前声明epcis和dts两个命名空间,同时在查询路径中补全对应前缀即可,修改后的完整代码如下:
BEGIN DECLARE @archivo XML SET @archivo = ( '<?xml version="1.0" encoding="utf-8"?> <epcis:EPCISDocument xmlns:dts="urn:dts:extension:xsd" schemaVersion="1.2" creationDate="2021-06-30T07:29:32.6511940Z" xmlns:epcis="urn:epcglobal:epcis:xsd:1"> <EPCISBody> <EventList> <ObjectEvent> <eventTime>2021-06-30T07:29:32</eventTime> <eventTimeZoneOffset>+02:00</eventTimeZoneOffset> <action>OBSERVE</action> <bizStep>code</bizStep> <dts:epcItemList> <item> <epc>123456789</epc> <code>123456789zz</code> </item> <item> <epc>9687654321</epc> <code>9687654321zz</code> </item> <item> <epc>147258369</epc> <code>147258369zz</code> </item> </dts:epcItemList> </ObjectEvent> </EventList> </EPCISBody> </epcis:EPCISDocument>' ) -- 显式声明命名空间,URI需和XML内定义的完全一致 ;WITH XMLNAMESPACES ( 'urn:epcglobal:epcis:xsd:1' AS epcis, 'urn:dts:extension:xsd' AS dts ) SELECT patch.r.value('(epc)[1]', 'varchar(100)') as [epc], patch.r.value('(code)[1]', 'varchar(100)') as [code] FROM -- 路径补全对应节点的命名空间前缀 @archivo.nodes('epcis:EPCISDocument/EPCISBody/EventList/ObjectEvent/dts:epcItemList/item') AS patch(r) END GO
执行后输出结果如下:
| epc | code |
|---|---|
| 123456789 | 123456789zz |
| 9687654321 | 9687654321zz |
| 147258369 | 147258369zz |
内容的提问来源于stack exchange,提问作者Juan Gómez
相关产品推荐
相关产品推荐

