如何将多工作表Excel(仅首表有表头)导入SQL Server单表?
嘿,这个场景我太熟了——处理过好多个这种多工作表续存数据的Excel导入需求,给你几个实用的方案,适配不同的使用习惯:
方案一:用SSMS导入向导(最直观,适合单次导入)
这是最适合新手或者只需要导入一次的方法,核心是用查询合并所有工作表而不是逐个导入:
- 打开SSMS,连接到你的目标数据库,右键点击数据库 → 「任务」→ 「导入数据」,启动导入向导。
- 「数据源」选择「Microsoft Excel」,选中你的.xls文件,版本选「Excel 97-2003」,勾选「首行包含列名」(这一步会读取第一个工作表的表头)。
- 「目标」选择「SQL Server Native Client」,填写你的数据库连接信息,点击下一步。
- 到「指定表复制或查询」步骤,先不要直接选表,点击「新建查询」,用
UNION ALL把所有工作表的数据合并起来,比如:
-- 第一个表带表头,直接SELECT * SELECT * FROM [Sheet1$] UNION ALL -- 后续表没有表头,直接取所有行(列顺序和首表一致) SELECT * FROM [Sheet2$] UNION ALL SELECT * FROM [Sheet3$] -- 把所有需要导入的工作表都按这个格式加进来
- 点击「预览」确认数据没问题,然后下一步,选择「立即执行」,完成导入。
⚠️ 注意:如果有工作表是空的,记得把对应的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)是最优解,能自动化整个流程:
- 新建SSIS项目,添加「Excel数据源」,配置时选中你的.xls文件,选择第一个工作表,勾选「首行包含列名」获取表头结构。
- 添加「Foreach循环容器」,枚举器选择「Foreach ADO.NET Schema Rowset Enumerator」,配置连接到Excel文件,Schema选「Tables」——这样可以自动遍历所有工作表。
- 在循环容器内添加「数据流任务」,里面的Excel数据源要动态指定工作表名(用变量存储遍历到的表名),并且设置:如果是第一个工作表,用
HDR=YES,其余工作表用HDR=NO。 - 把Excel数据源连接到「SQL Server目标」组件,映射好列,运行包就能自动合并所有工作表的数据到目标表。
通用注意事项
- 如果你是64位系统,导入时可能需要切换到32位运行时:SSMS → 「工具」→ 「选项」→ 「环境」→ 「常规」,勾选「使用32位运行时」,因为.xls的Jet驱动是32位的。
- 确保SQL Server服务账号有读取该Excel文件的权限,不然会出现「无法打开文件」的错误。
- 导入前务必检查所有工作表的列顺序和数据类型是否一致,避免因为类型不匹配导致导入失败。
内容的提问来源于stack exchange,提问作者Niky
相关产品推荐
相关产品推荐

