
SQL Server 中的 XML 数据类型 是一种原生数据类型,用于存储结构化 XML 内容。它不仅支持字符串形式的 XML 文本,还提供内置方法(如 .value()、.query()、.nodes()、.exist() 和 .modify())实现高效解析、查询与更新,无需外部解析器。
XML 类型字段的定义与插入
创建表时可直接使用 XML 作为列类型。支持 schema 验证(需先创建 XML Schema Collection),也支持无类型(untyped)XML 存储。
- 无类型示例:
CREATE TABLE docs (id INT, content XML); - 插入 XML:可用字符串字面量或变量,SQL Server 自动验证格式合法性
INSERT INTO docs VALUES (1, '<book><title>SQL Guide</title> <price>59.9</price></book>'); - 注意:插入内容必须是良构(well-formed)XML;若含未转义的
&、、<code>"等字符,会报错——应提前用REPLACE或应用程序层转义。
提取标量值:用 .value() 方法
.value() 从 XML 片段中提取单个 SQL 标量值(如 int、varchar、datetime),需指定 XPath 表达式和目标 SQL 类型。
本文档主要讲述的是mybatis语法和介绍;MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis 摒除了大部分的JDBC代码、手工设置参数和结果集重获。MyBatis 只使用简单的XML 和注解来配置和映射基本数据类型、Map 接口和POJO 到数据库记录。相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,Mybatis 是一种“半自动化”的ORM实现。感兴趣的朋友可
- 语法:
xml_column.value('XPath', 'SQL_Type') - 示例:取
<title></title>文本内容:content.value('(/book/title/text())[1]', 'NVARCHAR(100)') - 关键点:
• 必须加[1](返回首个匹配项),否则报错;
•text()显式获取文本节点,避免返回带标签的 XML 片段;
• 若路径可能不存在,可配合IS NULL判断,或用TRY_CAST+.value()防异常。
提取 XML 片段:用 .query() 与 .nodes()
.query() 返回 XML 类型结果,适合提取子树;.nodes() 将 XML 拆成行集,是关联查询的核心工具。
-
.query('XPath')示例:content.query('/book/author')返回所有<author></author>元素组成的 XML 片段 -
.nodes()常与CROSS APPLY搭配,把每个匹配节点映射为一行:SELECT T.c.value('(./name/text())[1]', 'NVARCHAR(50)') AS author_name<br>FROM docs<br>CROSS APPLY content.nodes('/book/authors/author') AS T(c); - 提示:XPath 中
.表示当前上下文节点;nodes()的路径必须返回元素节点集合,不能是文本或属性(除非用sql:column()等扩展)。
条件筛选与存在性判断:用 .exist()
.exist() 返回 1(存在匹配)、0(不匹配)或 NULL(XML 为 NULL),常用于 WHERE 或 JOIN 条件。
- 示例:查含价格大于 50 的图书记录:
WHERE content.exist('/book[price > 50]') = 1 - 注意:
>在 XPath 中必须写为>(实体编码),SQL Server 不支持直接写>;同理用<代替 - 也可结合变量:
content.exist('/book/price[text() = sql:variable("@target")]') = 1,实现动态值匹配。









