SQL Server中XML类型数据可以通过XQuery相关方法完成解析和提取,其中.nodes()、.value()、.query()是最常用的三个方法,各自承担不同的功能,也可以组合使用满足复杂的数据处理需求。

.nodes()方法的使用
.nodes()方法的作用是将XML实例中的节点拆分为多行,返回的是一个包含逻辑副本的表,每一行对应一个匹配的节点,适合处理XML中重复出现的同类型节点。
基础语法如下:
-- 语法格式 nodes (XQuery_expression) AS Table_Alias(Column_Alias)
示例:假设有一张存储用户订单信息的表,其中OrderXML字段是XML类型,存储了订单下的多个商品信息,使用.nodes()拆分商品节点:
-- 创建测试表并插入测试数据
CREATE TABLE OrderInfo (
OrderID INT PRIMARY KEY,
OrderXML XML
)
INSERT INTO OrderInfo VALUES
(1, '<order><product><name>笔记本</name><price>5000</price></product><product><name>鼠标</name><price>200</price></product></order>')
-- 使用.nodes()拆分product节点
SELECT
OrderID,
ProductNode
FROM OrderInfo
CROSS APPLY OrderXML.nodes('/order/product') AS T(ProductNode)
执行上述代码后,会返回两行数据,每个product节点对应一行,ProductNode列存储的是对应节点的完整XML内容。
.value()方法的使用
.value()方法的作用是从XML节点中提取单个标量值,返回的是SQL Server的原生数据类型,比如INT、VARCHAR等,适合需要把XML中的数据转为普通列值的场景。
基础语法如下:
-- 语法格式 value (XQuery_expression, SQL_type)
示例:基于上面的OrderInfo表,提取每个商品的名称和价格:
SELECT
OrderID,
ProductNode.value('(name)[1]', 'VARCHAR(50)') AS ProductName,
ProductNode.value('(price)[1]', 'INT') AS ProductPrice
FROM OrderInfo
CROSS APPLY OrderXML.nodes('/order/product') AS T(ProductNode)
执行后可以得到每个订单下商品的名称和价格,结果中ProductName是VARCHAR类型,ProductPrice是INT类型,可以直接用于后续的数值计算或者条件过滤。
.query()方法的使用
.query()方法的作用是返回XML片段,而不是标量值,适合需要提取XML中部分结构或者多个节点的场景,返回结果仍然是XML类型。
基础语法如下:
-- 语法格式 query (XQuery_expression)
示例:从订单XML中提取所有商品名称和价格的XML片段:
SELECT
OrderID,
OrderXML.query('/order/product/name') AS ProductNames,
OrderXML.query('/order/product/price') AS ProductPrices
FROM OrderInfo
执行后ProductNames列会返回包含所有name节点的XML,ProductPrices列返回包含所有price节点的XML,结果仍然是XML类型,可以继续使用其他XQuery方法处理。
三个方法的组合使用
实际场景中经常需要组合使用这三个方法,比如先用.nodes()拆分节点,再用.value()提取标量值,或者用.query()提取部分XML后再处理。
示例:先拆分product节点,再提取每个节点的完整商品信息XML,同时提取商品名称:
SELECT
OrderID,
ProductNode.query('.') AS FullProductXML, -- 当前节点的完整XML
ProductNode.value('(name)[1]', 'VARCHAR(50)') AS ProductName
FROM OrderInfo
CROSS APPLY OrderXML.nodes('/order/product') AS T(ProductNode)
上述代码中,.query('.')表示提取当前节点的所有内容,结合.nodes()拆分后,每个product节点的完整XML都会被提取出来,同时用.value()提取了商品名称,满足同时需要XML片段和标量值的需求。
注意事项
- XQuery表达式中的索引从1开始,比如(name)[1]表示第一个name节点,不要使用0作为索引。
- 使用.nodes()时通常需要配合CROSS APPLY或者OUTER APPLY,CROSS APPLY会过滤掉没有匹配节点的行,OUTER APPLY会保留没有匹配节点的行,对应节点列为NULL。
- .value()提取的XQuery表达式必须返回单个值,如果返回多个值会报错,需要配合[n]索引指定具体返回第几个值。
SQL_ServerXQuerynodes方法value方法query方法修改时间:2026-07-12 11:15:25