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

SQL Server 如何从XML列中提取指定节点的属性值

问题原因
  • 你的XPath语法本身没有错误,问题出在XML的命名空间处理上:XML根节点定义了默认命名空间xmlns="system/schema",所有节点都归属该命名空间,查询时没有声明对应命名空间,XPath会将节点判定为无命名空间,因此匹配不到任何节点,返回空结果。
  • 你使用了CROSS APPLY,等价于SQL内连接,如果任意一个nodes()方法未匹配到节点,整行结果都会被过滤,无法得到你要的NULL返回值。
正确实现代码

场景1:一行返回两个eventtype对应的value值(匹配你原查询的输出格式)

WITH XMLNAMESPACES (DEFAULT 'system/schema')
SELECT  
    x.v.value('@value','VARCHAR(100)') AS EventValue,
    y.v.value('@value','VARCHAR(100)') AS EventValue2
FROM #demo2 t
OUTER APPLY field1.nodes('//eventdetail[@eventtype="100"]/eventitem') x(v)
OUTER APPLY field1.nodes('//eventdetail[@eventtype="102"]/eventitem') y(v)

执行后返回结果与你预期完全一致:

EventValueEventValue2
abc123NULL

场景2:按eventdetail分行返回所有结果

如果你需要每个eventtype对应一行结果,可以使用以下写法:

WITH XMLNAMESPACES (DEFAULT 'system/schema')
SELECT  
    ed.v.value('@eventtype','INT') AS EventType,
    ei.v.value('@value','VARCHAR(100)') AS EventValue
FROM #demo2 t
CROSS APPLY field1.nodes('//eventdetail') ed(v)
OUTER APPLY ed.v.nodes('eventitem') ei(v)

返回结果:

EventTypeEventValue
100abc123
102NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:24:04