SQL Server中使用XQuery处理XML数据需掌握三个核心方法:query()返回XML节点片段,value()提取标量值,nodes()结合CROSS APPLY将节点拆分为行集,适用于多节点转行操作。

在SQL Server中处理XML数据时,XQuery是一种强大的语言,用于查询和操作XML内容。如果你的表中包含XML类型的列,可以直接使用XQuery表达式来提取所需信息。下面介绍如何在SQL Server中使用XQuery进行基本的XML数据查询。
1. 使用query()方法执行XQuery表达式
SQL Server提供了几个XML方法,其中query()用于从XML字段返回匹配的节点或片段。
例如,有一个表Documents,其中DocData是XML类型:
CREATE TABLE Documents (
ID INT,
DocData XML
);
INSERT INTO Documents VALUES (1, '
SQL入门
张三
XML实战
李四
');
要查询所有Book节点:
SELECT DocData.query('/Books/Book') AS Books FROM Documents WHERE ID = 1;
这将返回所有元素的XML片段。
2. 使用value()方法提取标量值
当你需要从XML中提取具体值(如字符串、数字)作为SQL标量值时,使用value()方法。
例如,获取第一本书的标题:
SELECT DocData.value('(/Books/Book[1]/Title)[1]', 'NVARCHAR(50)') AS FirstTitle
FROM Documents WHERE ID = 1;
注意:
- XQuery路径用括号包围,并加[1]表示取第一个匹配项(XQuery基于1索引)。
- 第二个参数指定返回的SQL数据类型。
提取属性值也很常见,比如获取ID为2的书的ID属性:
SELECT DocData.value('(/Books/Book[@ID="2"]/@ID)[1]', 'INT') AS BookID
FROM Documents WHERE ID = 1;
3. 使用nodes()方法拆分XML为行集
当需要把XML中的多个节点转换为多行结果时,使用nodes()方法结合CROSS APPLY。
例如,将每本书作为一行输出:
SELECT
Book.node.value('(Title)[1]', 'NVARCHAR(100)') AS Title,
Book.node.value('(Author)[1]', 'NVARCHAR(50)') AS Author,
Book.node.value('(@ID)[1]', 'INT') AS ID
FROM Documents
CROSS APPLY DocData.nodes('/Books/Book') AS Book(node)
WHERE Documents.ID = 1;
说明:
-
nodes('/Books/Book')将每个元素生成一行。 - CROSS APPLY将XML节点映射到新的行集合。
- 别名
Book(node)中的node用于后续的value()调用。
4. 常用XQuery路径语法简记
掌握一些基本路径写法有助于快速编写查询:
-
/Books/Book:选择所有直接子节点Book。 -
/Books/Book[1]:选择第一个Book。 -
/Books/Book[@ID="1"]:选择ID属性等于"1"的Book。 -
//Title:选择任意位置的Title节点(慎用,性能较差)。 -
/Books/Book/Title/text():明确选择文本内容。
基本上就这些。SQL Server对XQuery的支持虽不完整(相比标准),但足以应对大多数场景。关键是理解query()、value()和nodes()三个核心方法的用途和语法差异。实际使用时注意性能,避免在大XML上频繁使用复杂路径。










