我能够将链接服务器设置到远程 Oracle 数据库,这最终是一个多步骤过程:
- 在 SQL Server 上安装 Oracle ODBC 驱动程序。
- 为 SQL Server 上的 Oracle 数据库创建系统 DSN。
- 使用系统 DSN 在 SQL Server 上创建链接服务器。
第 1 步:在服务器上安装 Oracle ODBC 驱动程序
一个。下载必要的Oracle Instant Client 包:Basic、ODBC 和 SQL*Plus(可选)
b.将包解压缩到 SQL 服务器上的本地目录,通常为 C:\Oracle。这应该会产生一个类似 C:\Oracle\instantclient_10_2 的 [directory],这将是本答案其余部分中引用的 [directory] 的值。
c。在包含以下内容的即时客户端 [目录] 中创建一个名为 tnsnames.ora 的文本文件:
OracleTnsName =
(
DESCRIPTION=
(
ADDRESS = (PROTOCOL=TCP)(HOST=10.1.3.42)(PORT=1521)
)
(
CONNECT_DATA = (SERVICE_NAME=acc)
)
)
注意:实际的 HOST、PORT 和 SERVICE_NAME 会因您要建立连接的 Oracle 服务器而异。这些信息通常可以使用 listeners 下的 Oracle 网络客户端工具找到。
OracleTnsName 可以是您希望分配给 Oracle 数据源的任何名称,将在设置系统 DSN 时使用。如果需要,您还可以使用上述语法在同一个 tnsnames.ora 文件中定义多个 TNS 名称。
d。将[目录]添加到系统PATH环境变量中。
e。创建一个名为 TNS_Admin 的新系统环境变量,其值为 [directory]
f。执行 [directory]\odbc_install.exe 实用程序以安装 Oracle ODBC 驱动程序。
g.建议您重新启动 SQL 服务器,但可能没有必要。此外,您可能希望为 SQL 服务器和 SQL 代理用户身份授予此目录的安全权限。
第 2 步:创建使用 Oracle ODBC 驱动程序的系统 DNS
一个。打开 ODBC 数据源管理器 工具。 [ 管理工具 --> 数据源 (ODBC) ]
b.选择系统 DSN 选项卡,然后选择添加按钮。
c。在驱动程序列表中,选择 Oracle in instantclient {version}。 (例如 'Oracle in instantclient 10_2'),然后选择 Finish 按钮。
d。指定以下内容:
-
Data Source Name: {系统 DSN 名称}
-
Description: {留空/空}
-
TNS Service Name:应该列出您在tnsnames.ora文件中定义的OracleTnsName,选择它作为值。
-
用户 ID:{Oracle 用户名}
e。选择测试连接按钮。系统应提示您提供 {Oracle 用户密码}。如果一切顺利,测试就会成功。
第 3 步:在 SQL 中创建到 Oracle 数据库的链接服务器
在 SQL Server 中打开一个查询窗口并执行以下命令:
EXEC sp_addlinkedserver
@server = '{Linked Server Name}'
,@srvproduct = '{System DSN Name}'
,@provider = 'MSDASQL'
,@datasrc = '{System DSN Name}'
EXEC sp_addlinkedsrvlogin
@rmtsrvname = '{Linked Server Name}'
,@useself = 'False'
,@locallogin = NULL
,@rmtuser = '{Oracle User Name}'
,@rmtpassword = '{Oracle User Password}'
注意:{Linked Server Name} 可以是您在引用 Oracle 服务器时要使用的任何名称,但 {System DNS Name} 必须与您之前创建的系统 DSN 的名称匹配。
{Oracle User Name} 应与系统 DSN 使用的用户 ID 相同,{Oracle User Password} 应与您用于成功测试 ODBC 连接的相同。有关解决 Oracle 链接服务器问题的信息,请参阅 KB 280106。
查询 Oracle 链接服务器
您可以使用OPENQUERY 在 Oracle 链接服务器上执行传递查询,但请注意,对于非常大的记录集,如果您在 pass-通过查询。将ORDER BY 子句从传递查询移到外部选择语句为我解决了这个问题。