如何在SQL Server 2017中通过存储过程处理XML格式的输入参数?

浅涛君_8861

浅涛君_8861

2026-09-16

576人浏览

原创

必须先调用sp_xml_preparedocument获取句柄,否则openxml因句柄为空报“invalid xml document”错误;句柄为int output变量,须配对sp_xml_removedocument防泄漏,并正确处理命名空间、flags标志位、xpath路径及xsinil空值映射。

如何在sql server 2017中通过存储过程处理xml格式的输入参数?

必须先调用 sp_xml_preparedocument,否则 OPENXML 直接报错“Invalid XML document”——这不是XML语法问题,是句柄为空导致的假性解析失败。

句柄声明与生命周期管理

句柄不是可选配置,而是强制中间状态:它是一个整数变量,必须显式声明为 INT 类型并带 OUTPUT 属性。漏掉 OUTPUT 或用 NULL 初始化都会让后续 OPENXML 返回空结果集。

  • @hdoc INT OUTPUT 是唯一合法声明方式;@hdoc = NULL 或未赋值就传入会触发静默失败
  • 每次 sp_xml_preparedocument 成功后,必须配对调用 sp_xml_removedocument @hdoc,否则内存持续泄漏(尤其在高频调用的存储过程中)
  • 不能复用句柄:同一 @hdoc 变量不能跨多次 XML 解析循环使用,每次都要重新 prepare + remove

命名空间和 flags 标志位必须显式匹配

XML 带 xmlns 时,默认完全不可见;flags 值选错会导致字段全为 NULL 且无任何提示。

  • 若 XML 含命名空间(如 <root xmlns="http://a.com"><item id="1"></item></root>),必须在 sp_xml_preparedocument 第三个参数中声明:N'xmlns:ns="http://a.com"',并在 XPath 中前缀 ns:
  • flags = 0:只取属性(@id 可读,<name></name> 内容丢失)
  • flags = 1:只取子元素(<name>Tom</name> 可读,@id 不可见)
  • flags = 2:两者都映射(推荐起步值,但需注意 WITH 中列名不能重复)

WITH 子句中的 XPath 是相对路径,不是绝对路径

WITH 里写的路径基于 OPENXML 的第二个参数(节点路径)定位后的上下文,写成绝对路径反而查不到数据。

  • XML 示例:<root><user><uid>100</uid><nick>Tom</nick></user></root>
  • OPENXML 第二个参数为 '/root/user',则 WITH 中应写 uid INT 'uid'uid INT './uid',不能写 '/root/user/uid'
  • 字符串字段务必指定长度:nick NVARCHAR(50) 'nick',不写默认 NVARCHAR(100),可能截断长昵称
  • 缺失节点要映射为 NULL,必须加 XSINILemail NVARCHAR(100) 'email' XSINIL

XML 字符串预处理不可省略

传入的 XML 字符串若含未转义的 &、<code>>sp_xml_preparedocument 会直接报错“illegal xml character”,错误位置提示毫无意义。

  • 最稳妥做法是在调用存储过程前由应用层做 HTML 实体编码
  • 若只能在 SQL 内处理,需用 REPLACE 预清洗:SET @xml = REPLACE(REPLACE(REPLACE(@xml, '&', '&'), '', '>')
  • 日期字段要求严格 ISO 格式(2023-10-05T14:30:00),否则转成 NULL 且无警告

真正容易被忽略的是:句柄泄漏在开发环境几乎不暴露问题,但上线后高频调用几分钟就会耗尽内存;而 XSINIL 和命名空间声明这两个点,一旦漏掉,数据就静默丢失,日志里连 warning 都没有。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.01

3884

5

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2024.08.01

4957

7

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2024.11.28

2242

7

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4291

4

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

2205

3

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2023.08.14

3581

10

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

2023.08.31

2331

3

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.05

807

5

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

2147

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.1万人学习