SQL Server XQuery三大方法分工明确:.nodes()将XML拆解为行集,.value()提取单个标量值,.query()返回XML片段;须按nodes→value/query顺序组合使用。

SQL Server 的 XQuery 方法(.nodes()、.value()、.query())是用来处理 XML 类型数据的核心函数,它们分工明确:.nodes() 用于“拆解”XML 成行集,.value() 用于提取单个标量值,.query() 用于返回 XML 片段。用对了,解析 XML 就很清爽;用混了,容易报错或结果为空。
.nodes():把 XML 拆成虚拟表,方便 JOIN 和遍历
它接收一个 XPath 表达式,把匹配到的每个节点作为一行返回,结果是带 XML 类型列的派生表。必须配合 APPLY 使用,不能单独写在 SELECT 列表里。
常见写法:
-
FROM @xml.nodes('/root/item') AS T(c)—— 把每个节点变成一行,别名T,列名c是该节点的 XML 实例 - 之后就可以在 SELECT 或 WHERE 中对
c调用.value()或.query() - 注意:XPath 区分大小写,且路径必须存在;若无匹配,.nodes() 返回空结果集(不是 NULL)
.value():从单个 XML 节点里取一个具体值(字符串、数字、日期等)
它只能作用于一个节点(所以常跟在 .nodes() 后),第二个参数是 SQL Server 数据类型(如 'int'、'varchar(50)'、'datetime'),必须加单引号。
关键细节:
- 第一个参数是 XPath 表达式,支持
text()(取文本内容)、@attr(取属性)、.(取当前节点全部文本) - 如果 XPath 找不到值,.value() 报错;可用
isnull(c.value('(...)[1]', 'int'), 0)防错([1] 很重要,强制取第一个) - 示例:
c.value('(name/text())[1]', 'nvarchar(50)')取John 中的 "John"
.query():按 XPath 提取一段 XML 子树,返回仍是 XML 类型
适合保留结构、嵌套内容或后续再解析的场景。它不转换类型,只做“裁剪”。
典型用法:
-
c.query('address')—— 提取当前节点下的 元素及其所有子节点 -
c.query('*/phone')—— 提取所有层级下的元素(含祖先) - 结果可直接 CAST 为 VARCHAR 查看,或继续调用 .nodes()/.value() 深入解析
- 注意:如果 XPath 不匹配,.query() 返回空 XML(
>),不会报错
基本上就这些。记住口诀:要转行用 .nodes(),要取值用 .value(),要留结构用 .query()。三者常组合使用,顺序一般是 nodes → value/query,别反着来。










