【数据快速导入】:Access/Excel数据快速导入SQL Server数据库
使用 OPENROWSET 和 OPENDATASOURCE 将 Access 数据导入 SQL Server
当我们需要将数据从 Microsoft Access 数据库迁移到 SQL Server。SQL Server 提供了两种强大的方法来实现这一目标:OPENROWSET 和 OPENDATASOURCE。本文将详细介绍如何使用这两种方法将 Access 数据库中的 ML_TF表数据导入到 SQL Server的ML_TF表中。
准备工作
在开始之前,请确保满足以下前提条件:
- 已安装 Microsoft Access Database Engine(ACE OLEDB 驱动程序)
- SQL Server 服务账户对 Access 数据库文件有读取权限
- SQL Server 服务器已启用 Ad Hoc Distributed Queries
启用 Ad Hoc Distributed Queries
在使用 OPENROWSET 或 OPENDATASOURCE 之前,需要先启用 Ad Hoc Distributed Queries:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
方法一:使用 OPENROWSET
OPENROWSET 函数提供了一种在 SQL Server 中访问远程数据的方法,无需预先设置链接服务器。
基本语法
INSERT INTO target_table (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM OPENROWSET(
'Microsoft.ACE.OLEDB.12.0',
'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=path_to_access_db;',
'SELECT * FROM source_table'
);
实际示例
-- 导入所有数据
INSERT INTO ml_tf (id, name, value, created_date)
SELECT id, name, value, created_date
FROM OPENROWSET(
'Microsoft.ACE.OLEDB.12.0',
'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\data\your_database.accdb;Persist Security Info=False;',
'SELECT * FROM ml_tf'
);
-- 导入特定条件的数据
INSERT INTO ml_tf (id, name, value, created_date)
SELECT id, name, value, created_date
FROM OPENROWSET(
'Microsoft.ACE.OLEDB.12.0',
'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\data\your_database.accdb;',
'SELECT * FROM ml_tf WHERE value > 100 AND created_date >= #2023-01-01#'
);
方法二:使用 OPENDATASOURCE
OPENDATASOURCE 函数提供了另一种访问远程数据的方法,它不使用链接服务器名称,而是提供特殊的连接信息。
基本语法
INSERT INTO target_table (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM OPENDATASOURCE(
'Microsoft.ACE.OLEDB.12.0',
'Data Source=path_to_access_db;'
)...source_table;
实际示例
-- 导入所有数据
INSERT INTO ml_tf (id, name, value, created_date)
SELECT id, name, value, created_date
FROM OPENDATASOURCE(
'Microsoft.ACE.OLEDB.12.0',
'Data Source=C:\data\your_database.accdb;'
)...ml_tf;
-- 导入特定列的数据
INSERT INTO ml_tf (id, name, value)
SELECT id, name, value
FROM OPENDATASOURCE(
'Microsoft.ACE.OLEDB.12.0',
'Data Source=C:\data\your_database.accdb;'
)...ml_tf;
处理不同版本的 Access 数据库
对于 .accdb 格式(Access 2007及以上版本)
-- 使用 ACE OLEDB 12.0 提供程序
INSERT INTO ml_tf (id, name, value, created_date)
SELECT id, name, value, created_date
FROM OPENROWSET(
'Microsoft.ACE.OLEDB.12.0',
'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\data\your_database.accdb;',
'SELECT * FROM ml_tf'
);
对于 .mdb 格式(Access 2003及以下版本)
-- 使用 Jet OLEDB 4.0 提供程序
INSERT INTO ml_tf (id, name, value, created_date)
SELECT id, name, value, created_date
FROM OPENROWSET(
'Microsoft.Jet.OLEDB.4.0',
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\data\your_database.mdb;',
'SELECT * FROM ml_tf'
);
创建链接服务器的替代方法
如果经常需要访问 Access 数据库,可以考虑创建链接服务器:
-- 创建链接服务器
EXEC sp_addlinkedserver
@server = 'AccessLink',
@provider = 'Microsoft.ACE.OLEDB.12.0',
@srvproduct = 'OLE DB Provider for ACE',
@datasrc = 'C:\data\your_database.accdb';
-- 使用四部分名称查询
INSERT INTO ml_tf (id, name, value, created_date)
SELECT id, name, value, created_date
FROM AccessLink...ml_tf;
常见问题及解决方案
1. 权限问题
确保 SQL Server 服务账户对 Access 数据库文件有读取权限。如果遇到权限问题,可以尝试:
- 将 Access 数据库文件移动到 SQL Server 服务账户有访问权限的目录
- 修改 SQL Server 服务账户的权限设置
2. 驱动程序问题
如果遇到 "未注册的提供程序" 错误,请确保已安装正确版本的 Microsoft Access Database Engine:
- 对于 32 位 SQL Server,安装 32 位版本的 ACE 驱动程序
- 对于 64 位 SQL Server,安装 64 位版本的 ACE 驱动程序
3. 路径问题
使用完整路径而不是相对路径,并确保路径中使用正确的斜杠:
-- 正确示例
'Data Source=C:\data\your_database.accdb;'
-- 错误示例
'Data Source=.\data\your_database.accdb;'
验证导入结果
导入完成后,建议验证数据是否正确导入:
-- 检查导入的行数
SELECT COUNT(*) AS ImportedRows FROM ml_tf;
-- 查看前10行数据
SELECT TOP 10 * FROM ml_tf;
-- 比较源表和目标表的数据
SELECT
(SELECT COUNT(*) FROM OPENROWSET(...)...ml_tf) AS SourceCount,
(SELECT COUNT(*) FROM ml_tf) AS TargetCount;
性能优化建议
- 批量插入:对于大量数据,考虑使用批量插入操作
- 索引管理:在导入前删除目标表上的索引,导入完成后重新创建
- 事务管理:对于大型数据集,合理使用事务以避免日志文件过大
- 分批处理:如果数据量非常大,考虑分批导入数据
总结
使用 OPENROWSET 和 OPENDATASOURCE 是将 Access 数据导入 SQL Server 的有效方法。这两种方法都提供了灵活的数据访问方式,无需预先设置链接服务器。选择哪种方法取决于具体需求和个人偏好。
- OPENROWSET 更适合单次或偶尔的数据导入操作
- OPENDATASOURCE 语法更简洁,但功能稍有限制
- 对于频繁的数据访问,考虑创建链接服务器
无论选择哪种方法,都要确保满足前提条件,特别是正确安装 OLEDB 驱动程序并设置适当的权限。通过遵循本文中的指南和最佳实践,您可以成功地将 Access 数据库中的 ml_tf 表数据导入到 SQL Server 表中。
Excel数据快速导入SQL Server数据库表
--OPENDATASOURCE
INSERT INTO dept (dep_no, dep_name, top_dep ,sys_man, sys_dd, bstop, rem)
SELECT dep_no, dep_name, top_dep ,sys_man, sys_dd, bstop, rem
FROM OPENDATASOURCE(
'Microsoft.ACE.OLEDB.12.0',
'Data Source=D:Data\部门表20250901_1719.xlsx;Extended Properties="Excel 12.0;HDR=YES;IMEX=1"'
)...[Sheet1$];
--OPENROWSET
INSERT INTO dept (dep_no, dep_name, top_dep, sys_man, sys_dd, bstop, rem)
SELECT dep_no, dep_name, top_dep, sys_man, sys_dd, bstop, rem
FROM OPENROWSET(
'Microsoft.ACE.OLEDB.12.0',
'Excel 12.0; Database=D:\Data\部门表20250901_1719.xlsx; HDR=YES; IMEX=1',
'SELECT dep_no, dep_name, top_dep, sys_man, sys_dd, bstop, rem FROM [Sheet1$]'
);