SQL Server中XML值查询能否在XPath的[]中使用[*]通配符?
在SQL Server中对XML值进行通配符查询的实现方法
首先明确:不能在SQL Server的value方法XPath表达式的[]中使用*作为通配符,你遇到的语法错误正是因为(/ATTRIBUTE/ATTRIBUTEID)[*]是非法的XPath语法,SQL Server不支持这种写法。
针对你的XML结构和查询需求,以下是几种正确的实现方式:
1. 使用exist方法(推荐,性能最优)
如果只是要判断XML中是否存在符合条件的ATTRIBUTEID节点,exist方法是最佳选择——它直接在XML内部完成判断,无需提取所有节点值:
- 精确匹配特定值:
WHERE [COMMAND].exist('/ATTRIBUTE[ATTRIBUTEID/text() = "C"]') = 1
- 模糊匹配(对应原语句的
LIKE场景):
WHERE [COMMAND].exist('/ATTRIBUTE[contains(ATTRIBUTEID/text(), "C")]') = 1
2. 使用nodes方法拆分节点后筛选
如果需要提取所有符合条件的ATTRIBUTEID值,可以先用nodes方法将XML中的ATTRIBUTE节点拆分出来,再结合value方法查询:
SELECT attr.value('ATTRIBUTEID[1]', 'varchar(20)') AS ATTRIBUTEID FROM 你的表名 CROSS APPLY [COMMAND].nodes('/ATTRIBUTE') AS x(attr) WHERE attr.value('ATTRIBUTEID[1]', 'varchar(20)') LIKE '%C%'
补充说明
你原语句中试图用[*]匹配任意位置的节点,其实/ATTRIBUTE/ATTRIBUTEID本身就会匹配所有ATTRIBUTE下的ATTRIBUTEID节点,但value方法只会返回第一个匹配的节点,无法直接实现"任意节点匹配"的判断逻辑,因此必须借助exist或nodes方法来实现需求。
内容的提问来源于stack exchange,提问作者Kirti
相关产品推荐
相关产品推荐

