SQL Server的XQuery方法 .nodes() .value() .query() 怎么用

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,别反着来。