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)
执行后返回结果与你预期完全一致:
| EventValue | EventValue2 |
|---|---|
| abc123 | NULL |
场景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)
返回结果:
| EventType | EventValue |
|---|---|
| 100 | abc123 |
| 102 | NULL |
内容的提问来源于stack exchange,提问作者isakavis
相关产品推荐
相关产品推荐

