SQL XML 数据类型解析与查询方法

6次阅读

SQL XML 数据类型解析与查询方法

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 类型。

  • 语法: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,实现动态值匹配。

text=ZqhQzanResources