把 Excel 值放进 SQL Server,最稳的路线是:少量数据用 SSMS 导入向导,大批量用 CSV + BULK INSERT,周期同步用 SSIS 或 PowerShell + SqlBulkCopy,核心不是“能不能导”,而是先分清一次性导入、本地到远程导入和自动更新这几种场景。
SQL Server 如何导入 Excel 数据:先判断一次性还是自动同步
一次性导入与周期同步的差别
一次性导入,目标是把当前 Excel 的值搬进某张表,做完就不用管了。
周期同步,目标是每周、每天甚至每小时从 Excel 取数,它更关心自动化、报错重试和字段映射稳定性。
行业共识认为,Excel 适合人工整理,不适合当长期数据库,只要数据要反复用,就应该尽早落到 SQL Server 表里。
| 场景 | 推荐方式 | 适合数据量 | 注意点 |
|---|---|---|---|
| 偶尔导一次 | SSMS 导入导出向导 | 几千到几万行 | 列类型容易推断错 |
| 大批量入表 | CSV + BULK INSERT | 几十万行以上 | 文件要在服务器可访问路径 |
| 直接读 xlsx | OPENROWSET + ACE 驱动 | 中小批量 | 驱动位数必须匹配 |
| 每天自动更新 | SSIS 或 PowerShell | 按任务定 | 凭据、路径、日志要配好 |
| 本地推远程 | SqlBulkCopy | 中大批量 | 网络稳定性和超时 |
选方法前先看四个硬条件
- 文件在哪里:本地电脑,还是 SQL Server 主机?
- 数据量多大:几百行和几十万行,方案完全不同。
- 是否重复:只导一次,还是每天覆盖或追加?
- 能否装驱动:读 xlsx 通常要 Access Database Engine。
据微软官方文档,使用 OPENROWSET 读取 xlsx 需要安装 Access Database Engine,并开启 Ad Hoc Distributed Queries,这个限制经常被忽略。
SQL Server 导入 Excel 数据工具收费吗,免费路径有哪些
免费自带路径
SQL Server 和 SSMS 本身已经带了不少导入能力,多数情况下,不需要额外买工具。
- SSMS 导入导出向导:图形界面,适合临时导入。
- bcp 命令行:适合脚本化、批处理。
- BULK INSERT:T-SQL 直接执行,适合 CSV。
- OPENROWSET:能直接查 Excel 工作表,适合小批量。
- SSIS:适合做企业级定时同步。
- PowerShell + SqlBulkCopy:适合本地推到远程。
据微软官方文档,SSMS 的导入导出向导随 SQL Server 管理工具提供,它不会因为“导入 Excel”单独收费。
第三方工具什么时候值得买
第三方工具通常强在可视化映射、增量同步、调度和错误诊断,它们按授权收费,具体取决于版本、用户数和部署方式。
如果只是每月导一次报表,自带工具足够,如果要每天同步多个 Excel,还要记录失败日志,第三方工具可能省人工。
本地 Excel 导入远程 SQL Server 数据库怎么做
SSMS 向导直连远程
这是最直观的办法,SSMS 在本地读取 Excel,再把数据写到远程 SQL Server。
操作路径:
- 打开 SSMS,连接远程 SQL Server。
- 右键目标数据库,选择“任务” -> “导入数据”。
- 数据源选 Microsoft Excel,选中本地 xlsx 文件。
- 目标选 SQL Server Native Client 或 OLE DB Provider。
- 输入远程服务器地址、数据库名和认证方式。
- 选择目标表,检查列映射。
- 运行后,用
SELECT TOP 100 FROM dbo.Target验证。
注意:本地 SSMS 能读 Excel,不代表远程 SQL Server 能读本地路径,向导是把数据从客户端推过去。
上传 CSV 到服务器再 BULK INSERT
如果数据量大,这个方案更快。
先把 Excel 另存为 CSV,字段用逗号分隔,日期统一成 yyyy-MM-dd,编码优先 UTF-8。
再把 CSV 放到 SQL Server 主机可访问的目录,
C:Dataimport.csv。
执行:
BULK INSERT dbo.Target FROM 'C:Dataimport.csv' WITH ( FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR = 'n', CODEPAGE = '65001', TABLOCK );
SQL Server 服务账号没有读取权限,会报“拒绝访问”,给服务账号或所在组授予文件读取权限即可。
PowerShell + SqlBulkCopy 从本地推送
不想把文件传到服务器,可以用 PowerShell 在本地读数据,再批量写入远程库。
核心思路:
- 用
Import-Csv读取 CSV。 - 把数据放进 DataTable。
- 用
SqlBulkCopy写入远程表。
示例片段:
$conn = New-Object System.Data.SqlClient.SqlConnection( "Server=远程IP;Database=TestDB;Integrated Security=SSPI" ) $bulk = New-Object System.Data.SqlClient.SqlBulkCopy($conn) $bulk.DestinationTableName = "dbo.Target" $bulk.BatchSize = 5000 $bulk.WriteToServer($dt)
这种方式适合本地 Excel 导出成 CSV 后,定时推送到远程 SQL Server。
SQL Server 批量导入 Excel 数据到临时表的高效写法
先建暂存表,别直接冲正式表
Excel 列类型经常不稳定,第一行是数字,后面出现“暂无”,整列就可能变文本。
稳妥做法是先建暂存表,字段先多用 nvarchar。
CREATE TABLE dbo.Stg_ExcelData ( Col1 nvarchar(255), Col2 nvarchar(255), Col3 nvarchar(255) );
导入暂存表后,再用 TRY_CAST、TRY_CONVERT 清洗。
SELECT TRY_CAST(Col1 AS int) AS Id, LTRIM(RTRIM(Col2)) AS Name, TRY_CONVERT(date, Col3, 23) AS CreatedDate FROM dbo.Stg_ExcelData;
合并到正式表
清洗后可以追加:
INSERT INTO dbo.Target (Id, Name, CreatedDate) SELECT Id, Name, CreatedDate FROM dbo.Stg_ExcelData WHERE Id IS NOT NULL;
也可以更新已有记录:
UPDATE t SET t.Name = s.Name FROM dbo.Target t JOIN dbo.Stg_ExcelData s ON t.Id = s.Id;
业内专家指出,MERGE 语句写起来简洁,但在高并发写入场景要谨慎,事务、锁和唯一索引要先设计好。
常见报错与排查清单
- 未注册 Microsoft.ACE.OLEDB.12.0:安装 Access Database Engine,并确认 32 位和 64 位与 SQL Server 匹配。
- 操作系统错误 5,拒绝访问:检查 SQL Server 服务账号对文件目录的权限。
- 文本被截断:目标列长度不够,或 Excel 列被推断成短文本。
- 日期转换失败:CSV 日期统一成
yyyy-MM-dd,再用TRY_CONVERT。 - 导入后中文乱码:CSV 用 UTF-8,
CODEPAGE='65001'。 - OPENROWSET 报错:检查
Ad Hoc Distributed Queries是否开启,ACE 驱动是否安装。
把 Excel 值放进 SQL Server,关键是把文件路径、驱动位数、列类型和权限四件事对齐。
一次性导入用向导,批量导入用 BULK INSERT,自动同步用 SSIS 或 PowerShell,选对场景,比反复试错更省时间。
Q&A:SQL Server 导入 Excel 数据常见问题
SQL Server 导入 Excel 数据必须安装 ACE 驱动吗?
如果使用 SSMS 导入向导读 xlsx,或使用 OPENROWSET 直接查 Excel,通常需要 ACE 驱动,如果先把 Excel 另存为 CSV,再用 BULK INSERT 或 bcp,就不依赖 ACE 驱动。
Excel 几十万行,用复制粘贴还是 BULK INSERT?
复制粘贴适合几百行、一次性处理,几十万行建议走 CSV + BULK INSERT,或用 SSIS、SqlBulkCopy,它们更稳,也更容易记录错误。
SQL Server 导入 Excel 数据后如何每天自动更新?
常见做法是 SSIS 包配合 SQL Server Agent 作业,或者用 PowerShell 脚本配合 Windows 计划任务,文件要放在服务账号可访问的路径,连接凭据要保存在安全位置。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/731444.html





