OPENXML是SQL Server 2005+导入XML的传统方法,需先用sp_xml_preparedocument加载XML字符串,再通过OPENXML映射行集并INSERT,最后调用sp_xml_removedocument释放句柄;不支持直接读取磁盘文件,须预加载为XML变量。

XML文件导入SQL Server数据库,OPENXML 是一种传统但依然可用的方式,适用于SQL Server 2005及以后版本(含2022)。它需要先用 sp_xml_preparedocument 加载XML到内存,再通过 OPENXML 将其映射为行集,最后用 INSERT/SELECT 写入表。注意:它不直接读取外部XML文件,需先将XML内容作为字符串传入。
前提:XML内容必须先加载为XML数据类型
SQL Server的OPENXML不支持直接读取磁盘上的.xml文件(比如C:\data.xml),你得先把XML内容读成字符串或XML类型变量。常见做法:
- 用 OPENROWSET(BULK...) 从本地文件读取XML内容(需启用Ad Hoc Distributed Queries)
- 在应用层(如C#、Python)读取文件,拼成T-SQL脚本或用参数化方式传入XML字符串
- 测试时可直接写XML字面量(适合小样本)
基本用法四步走
以一个简单XML为例:
对应SQL操作如下:
m18麦考林整站 for Ecshop v2.7.3 安装方法: 1,解压rar包上传到网站根目录 2,导入sql数据库文件,到你的数据库里,可以phpmyadmin等软件 3,修改data里config.php里面的数据库 用户名 密码等信息 为你自己的数据库信息 4,安装完毕之后的后台用户名密码为: 后台地址:域名/admin 用户名:admin 密码:admin123 模板使用教程: htt
- 声明XML变量:DECLARE @xmlDoc XML = N'上面那段XML内容'
- 准备文档句柄:EXEC sp_xml_preparedocument @hDoc OUTPUT, @xmlDoc
- 用OPENXML查询节点:SELECT * FROM OPENXML(@hDoc, '/Customers/Customer', 2) WITH (ID INT '@ID', Name NVARCHAR(50) '@Name', Email NVARCHAR(100) '@Email')
- 释放句柄:EXEC sp_xml_removedocument @hDoc(必须调用,否则内存泄漏)
WITH子句中属性和元素的写法区别
OPENXML的WITH子句决定如何提取值,关键看XML中是属性(attribute)还是元素(element):
- @ID 表示取属性值(前面加@)
- ID(无@)默认取同名子元素的文本内容
- 若元素有子元素或混合结构,可用 './ElementName' 或 'text()' 显式指定
- 第三个参数(标志位)常用2=属性为中心,1=元素为中心,0=两者混合(推荐用2,语义清晰)
实用建议与注意事项
虽然OPENXML仍能用,但现代场景更推荐以下替代方案:
- 对XML列或变量,优先用原生XML方法:value()、nodes()、query(),语法更简洁、性能更好、无需手动管理句柄
- 大批量导入XML文件,建议用SSIS(SQL Server Integration Services)+ XML Source组件
- 如果必须用OPENXML,务必在TRY...CATCH中包裹,并确保sp_xml_removedocument被执行(哪怕出错也要清理)
- 权限方面:执行sp_xml_preparedocument需要db_owner或sysadmin角色,生产环境需谨慎授权









