You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server 2016中用nodes/value提取XML的Org值返回NULL求助

解决SQL Server XML提取值返回NULL的问题

嘿,问题很明确啦——你的XML文档包含了默认命名空间,但你的T-SQL查询完全没处理这个,这就是Rater列一直返回NULL的核心原因!

先看你的XML根元素:

<ACORD xmlns="http://www.ACORD.org/standards/PC_Surety/ACORD1.11.0/xml/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

这里的xmlns定义了整个XML的默认命名空间,所有子元素(包括<Org>)都属于这个命名空间。SQL Server的XML查询是严格区分命名空间的,如果你不声明并使用这个命名空间,查询引擎会去寻找没有命名空间的元素,自然找不到匹配的内容,所以返回NULL。

下面是修改后的两种查询写法:

1. 使用nodes()方法的修正版

需要先通过WITH XMLNAMESPACES声明默认命名空间,然后在XPath中使用对应的元素路径:

WITH XMLNAMESPACES(DEFAULT 'http://www.ACORD.org/standards/PC_Surety/ACORD1.11.0/xml/')
SELECT * 
FROM ( 
    SELECT rtr.BridgedDate, 
           rtr.RealTimeRequestSysId, 
           rtr.QuoteId, 
           rtr.AgentId, 
           rtr.XmlRequest, 
           x.m.value('(Org)[1]', 'varchar(max)') as Rater 
    FROM dbo.AUT_RealTimeRequest rtr 
    OUTER APPLY rtr.XmlRequest.nodes('ACORD/SignonRq/ClientApp') x(m) 
    WHERE rtr.BridgedDate BETWEEN '2020-11-01 00:00:00.000' AND '2020-11-30 23:59:59.997' 
) y 
WHERE y.AgentId = 3 AND y.QuoteId IS NOT NULL 
ORDER BY y.QuoteId asc, y.BridgedDate asc;

2. 使用value()方法的修正版

同样需要先声明命名空间,再调整XPath路径:

WITH XMLNAMESPACES(DEFAULT 'http://www.ACORD.org/standards/PC_Surety/ACORD1.11.0/xml/')
SELECT rtr.BridgedDate, 
       rtr.XMLRequest, 
       rtr.XMLRequest.value('(/ACORD/SignonRq/ClientApp/Org)[1]','varchar(max)') as RaterValue 
FROM dbo.AUT_RealTimeRequest rtr 
WHERE rtr.QuoteId IS NOT NULL 
  AND rtr.AgentId = 3 
  AND rtr.BridgedDate BETWEEN '2020-11-01 00:00:00.000' AND '2020-11-30 23:59:59.997' 
ORDER BY rtr.QuoteId asc, rtr.BridgedDate asc;

简单说,只要在查询开头加上WITH XMLNAMESPACES声明对应的命名空间,SQL Server就能正确识别XML里的元素,顺利提取出<Org>的值啦!

内容的提问来源于stack exchange,提问作者Melinda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:24:53