已安装驱动,如何通过ODBC连接Progress OpenEdge与MS SQL Server并导入数据?
从MS SQL Server通过ODBC连接Progress OpenEdge并导入全量数据的实操方案
刚好之前帮客户落地过一模一样的需求,下面是我整理的一步步实操指南,亲测有效:
1. 先确认ODBC驱动的连接有效性
你已经在ODBC数据源里加了驱动,但一定要先验证这个DSN能正常连上OpenEdge——这是后续所有操作的基础:
- 打开和你的SQL Server版本匹配的ODBC数据源管理器(划重点:64位SQL就用64位ODBC,32位同理,不匹配会直接失败)
- 找到你创建的OpenEdge DSN,点击「配置」,输入OpenEdge的服务器地址、端口、库名、账号密码,点「测试连接」。如果连不上,先排查OpenEdge服务是否启动、端口是否对外开放、账号权限是否足够。
2. 在SQL Server里创建链接服务器(Linked Server)
这一步是让SQL Server能直接“看到”OpenEdge的数据库,有两种方式:
2.1 用SSMS图形界面(新手友好)
- 打开SQL Server Management Studio,展开你的实例 → 「服务器对象」→ 右键「链接服务器」→ 「新建链接服务器」
- 常规选项卡:
- 链接服务器名称:取个好记的,比如
OpenEdge_Linked - 服务器类型选「其他数据源」
- 提供程序选
Progress OpenEdge ODBC Driver(要和你ODBC配置的驱动一致) - 产品名称填
OpenEdge - 数据源填你之前创建的ODBC数据源名称(就是DSN的名字)
- 链接服务器名称:取个好记的,比如
- 安全性选项卡:
- 选「使用此安全上下文建立连接」,然后输入OpenEdge的用户名和密码
- 点「确定」,如果配置没问题,链接服务器会创建成功,展开它就能看到OpenEdge里的表了。
2.2 用T-SQL脚本(适合自动化/批量场景)
如果你习惯用代码,执行下面的脚本(记得替换占位符):
-- 创建链接服务器 EXEC sp_addlinkedserver @server = N'OpenEdge_Linked', -- 自定义链接服务器名 @srvproduct=N'OpenEdge', @provider=N'MSDASQL', @datasrc=N'你的ODBC数据源名称'; -- 替换成实际DSN名 -- 设置安全登录 EXEC sp_addlinkedsrvlogin @rmtsrvname=N'OpenEdge_Linked', @useself=N'False', @rmtuser=N'OpenEdge账号', -- 替换成实际用户名 @rmtpassword=N'OpenEdge密码'; -- 替换成实际密码
测试一下:执行SELECT TOP 10 * FROM OpenEdge_Linked...["你的表名"],如果能返回数据就说明连接成功了(注意OpenEdge的表名可能区分大小写,需要用双引号包裹)。
3. 把OpenEdge的数据导入SQL Server
连接通了之后,导入数据有两种常用方式:
3.1 SSMS导入导出向导(可视化操作,适合全量导入)
- 右键你要导入数据的SQL数据库 → 「任务」→ 「导入数据」
- 数据源选「ODBC数据源」,然后选你的OpenEdge DSN,输入账号密码
- 目标选「SQL Server Native Client」,选择你的SQL实例和目标数据库
- 选择要导入的表:可以全选所有表,也可以挑需要的
- 配置导入选项:比如是否覆盖现有表、是否启用标识插入等,根据你的需求设置
- 最后点「完成」,等待导入完成就行。
3.2 T-SQL脚本导入(适合自定义逻辑/分批导入)
如果需要过滤数据、转换字段,或者数据量太大怕超时,用INSERT INTO...SELECT更灵活:
-- 方式1:直接创建新表并导入数据 SELECT * INTO SQL_Target_Table FROM OpenEdge_Linked...["OpenEdge_Source_Table"]; -- 替换成实际表名 -- 方式2:往已存在的表插入数据(需要字段匹配) INSERT INTO SQL_Target_Table (列1, 列2, 列3) SELECT 列1, 列2, 列3 FROM OpenEdge_Linked...["OpenEdge_Source_Table"] WHERE 你的过滤条件; -- 可选,比如只导入近一年的数据 -- 大数据量分批导入(避免锁表/超时) DECLARE @BatchSize INT = 10000; DECLARE @RowCount INT = 1; WHILE @RowCount > 0 BEGIN INSERT INTO SQL_Target_Table (主键列, 列1, 列2) SELECT TOP (@BatchSize) 主键列, 列1, 列2 FROM OpenEdge_Linked...["OpenEdge_Source_Table"] WHERE 主键列 NOT IN (SELECT 主键列 FROM SQL_Target_Table); SET @RowCount = @@ROWCOUNT; END
4. 常见坑点排查
- 链接服务器创建失败:大概率是ODBC驱动版本和SQL Server不匹配(64位/32位搞混了),或者OpenEdge的连接参数填错了,再仔细核对一遍。
- 找不到表对象:OpenEdge的表名通常是大写的,而且需要用双引号包裹,比如
"CUSTOMER",可以在ODBC数据源的「配置」里查看表名的实际格式。 - 导入超时:数据量太大的话,调整SQL Server的远程查询超时时间(实例属性 → 连接 → 远程查询超时),或者用上面的分批导入脚本。
内容的提问来源于stack exchange,提问作者Zubair Sultan
相关产品推荐
相关产品推荐

