SQL Server 2019查询带默认命名空间的XML无法取值如何解决?
SQL Server XML提取Header属性问题排查
首先可以确认,你定义的默认命名空间完全正确,问题出在节点定位和属性提取逻辑上,具体错误点如下:
错误原因
- 节点定位层级错误:
nodes()方法指定的路径仅到CompanyListMessage节点,此时h变量指向的是<CompanyListMessage>节点,而非其子节点<Header>,自然无法直接提取Header的属性。 - 属性提取逻辑错误:
GeneratedAt是<Header>节点的属性,不是带有文本内容的独立子节点,(GeneratedAt/text())[1]的路径不存在,一定会返回空值。
正确实现方案
方案1(推荐):直接定位到Header节点
路径清晰,查询性能更好,适合只需要提取Header属性的场景:
WITH XMLNAMESPACES(DEFAULT N'http://www.ediel.no/Export') SELECT t.file_name, t.file_created_time, h.value(N'@GeneratedAt', 'varchar(50)') AS GeneratedAt, h.value(N'@SenderApplication', 'varchar(100)') AS SenderApplication FROM load.ediel_actors t OUTER APPLY t.xml_data.nodes('/ExportPartyAddressingResponse/CompanyListMessage/Header') AS header(h)
方案2:保留原节点定位,补全Header层级
如果你需要同时提取CompanyListMessage下其他节点的内容,可以使用这个写法:
WITH XMLNAMESPACES(DEFAULT N'http://www.ediel.no/Export') SELECT t.file_name, t.file_created_time, h.value(N'(Header/@GeneratedAt)[1]', 'varchar(50)') AS GeneratedAt, h.value(N'(Header/@SenderApplication)[1]', 'varchar(100)') AS SenderApplication FROM load.ediel_actors t OUTER APPLY t.xml_data.nodes('/ExportPartyAddressingResponse/CompanyListMessage') AS header(h)
逻辑验证
你可以用静态XML片段快速验证逻辑正确性,运行以下代码可直接输出Header的两个属性:
DECLARE @xml XML = N' <ExportPartyAddressingResponse xmlns="http://www.ediel.no/Export"> <CompanyListMessage> <Header GeneratedAt="2021-11-11T05:00:02Z" SenderApplication="www.ediel.se" /> </CompanyListMessage> </ExportPartyAddressingResponse>'; WITH XMLNAMESPACES(DEFAULT N'http://www.ediel.no/Export') SELECT @xml.value(N'(/ExportPartyAddressingResponse/CompanyListMessage/Header/@GeneratedAt)[1]', 'varchar(50)') AS GeneratedAt, @xml.value(N'(/ExportPartyAddressingResponse/CompanyListMessage/Header/@SenderApplication)[1]', 'varchar(100)') AS SenderApplication
内容的提问来源于stack exchange,提问作者Mattias W
相关产品推荐
相关产品推荐

