You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多工作表Excel(仅首表有表头)导入SQL Server单表?

嘿,这个场景我太熟了——处理过好多个这种多工作表续存数据的Excel导入需求,给你几个实用的方案,适配不同的使用习惯:

方案一:用SSMS导入向导(最直观,适合单次导入)

这是最适合新手或者只需要导入一次的方法,核心是用查询合并所有工作表而不是逐个导入:

  1. 打开SSMS,连接到你的目标数据库,右键点击数据库 → 「任务」→ 「导入数据」,启动导入向导。
  2. 「数据源」选择「Microsoft Excel」,选中你的.xls文件,版本选「Excel 97-2003」,勾选「首行包含列名」(这一步会读取第一个工作表的表头)。
  3. 「目标」选择「SQL Server Native Client」,填写你的数据库连接信息,点击下一步。
  4. 到「指定表复制或查询」步骤,先不要直接选表,点击「新建查询」,用UNION ALL把所有工作表的数据合并起来,比如:
-- 第一个表带表头,直接SELECT *
SELECT * FROM [Sheet1$]
UNION ALL
-- 后续表没有表头,直接取所有行(列顺序和首表一致)
SELECT * FROM [Sheet2$]
UNION ALL
SELECT * FROM [Sheet3$]
-- 把所有需要导入的工作表都按这个格式加进来
  1. 点击「预览」确认数据没问题,然后下一步,选择「立即执行」,完成导入。

⚠️ 注意:如果有工作表是空的,记得把对应的UNION ALL行删掉,不然会报错。

方案二:用OPENROWSET写SQL脚本(适合喜欢用代码控制的用户)

如果你习惯用SQL脚本操作,可以直接写语句导入,灵活性更高:

第一步:启用Ad Hoc Distributed Queries(首次运行需要)

sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;

第二步:创建目标表(如果还没有)

先从第一个工作表复制表结构:

SELECT TOP 0 * INTO YourTargetTableName
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
                'Excel 8.0;Database=C:\YourPath\YourFile.xls;HDR=YES',
                'SELECT * FROM [Sheet1$]');

第三步:导入所有工作表数据

-- 导入第一个带表头的工作表
INSERT INTO YourTargetTableName
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
                         'Excel 8.0;Database=C:\YourPath\YourFile.xls;HDR=YES',
                         'SELECT * FROM [Sheet1$]');

-- 导入第二个工作表(无表头,HDR=NO)
INSERT INTO YourTargetTableName
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
                         'Excel 8.0;Database=C:\YourPath\YourFile.xls;HDR=NO',
                         'SELECT * FROM [Sheet2$]');

-- 重复上面的INSERT语句,把所有后续工作表都加进来
INSERT INTO YourTargetTableName
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
                         'Excel 8.0;Database=C:\YourPath\YourFile.xls;HDR=NO',
                         'SELECT * FROM [Sheet3$]');

方案三:用SSIS(适合重复/批量导入场景)

如果你以后需要多次导入这类文件,SSIS(SQL Server Integration Services)是最优解,能自动化整个流程:

  1. 新建SSIS项目,添加「Excel数据源」,配置时选中你的.xls文件,选择第一个工作表,勾选「首行包含列名」获取表头结构。
  2. 添加「Foreach循环容器」,枚举器选择「Foreach ADO.NET Schema Rowset Enumerator」,配置连接到Excel文件,Schema选「Tables」——这样可以自动遍历所有工作表。
  3. 在循环容器内添加「数据流任务」,里面的Excel数据源要动态指定工作表名(用变量存储遍历到的表名),并且设置:如果是第一个工作表,用HDR=YES,其余工作表用HDR=NO。
  4. 把Excel数据源连接到「SQL Server目标」组件,映射好列,运行包就能自动合并所有工作表的数据到目标表。

通用注意事项

  • 如果你是64位系统,导入时可能需要切换到32位运行时:SSMS → 「工具」→ 「选项」→ 「环境」→ 「常规」,勾选「使用32位运行时」,因为.xls的Jet驱动是32位的。
  • 确保SQL Server服务账号有读取该Excel文件的权限,不然会出现「无法打开文件」的错误。
  • 导入前务必检查所有工作表的列顺序和数据类型是否一致,避免因为类型不匹配导致导入失败。

内容的提问来源于stack exchange,提问作者Niky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:55:59