-
参考文章:
-
https://support.microsoft.com/kb/280102/zh-cn?ppud=4&wa=wsignin1.0
-
-
-
-
-
-
本文内容
<style>.tocTitle, #tocDiv{display: none;}</style>
概要
本分步指南介绍了如何设置链接服务器到运行 Microsoft SQL Server 的计算机上 Sybase 数据库服务器。此外,这篇文章包含了基本的故障排除步骤设置 Sybase 数据库服务器到链接服务器时可能出现的问题。
设置链接服务器到 Sybase 数据库服务器
若要设置到 Sybase 数据库服务器的链接服务器,请执行以下步骤:
- 登录到正在运行 SQL Server 的计算机上。
- 在计算机上安装的 Sybase 客户端软件。
- 要连接到 Sybase 数据库服务器,请在计算机上安装适当的驱动程序。可以使用 Microsoft OLE DB 提供程序的 ODBC 连接到 Sybase 数据库服务器。
注意您还可以使用第三方驱动程序或提供程序连接到 Sybase 数据库服务器。如果您使用一个第三方驱动程序或提供程序,您必须与第三方供应商联系的任何问题的发生与该驱动程序或提供程序。 - Sybase 客户端软件安装后,重新启动计算机。
- 请确保您可以成功地连接到 Sybase 数据库服务器通过使用您在步骤 2 中安装的 Sybase 客户端软件。
- 启动 SQL 查询分析器中,并运行下面的事务处理 SQL 语句,以设置与 Sybase 数据库服务器的链接服务器。
注意此脚本使用 Microsoft OLE DB 提供程序的 ODBC 连接到 ODBC 驱动程序针对 Sybase。适当的链接的服务器名称、 系统 DSN、 用户名称和密码替换Sybase Linked Server Name、Sybase System DSN,User Name和Strong Password。-- Adding linked server: exec sp_addlinkedserver @server = 'Sybase Linked Server Name' , @srvproduct = 'Sybase', @provider = 'MSDASQL', @datasrc = 'Sybase System DSN' -- Adding linked server login: sp_addlinkedsrvlogin @useself='false ', @rmtsrvname = 'Sybase Linked Server Name', @rmtuser = 'User Name', @rmtpassword = 'Strong Password'
- 若要确保正确设置链接的服务器,请运行下面的事务处理 SQL 语句:
EXEC sp_linkedservers
可能会出现的问题的疑难解答
如果设置 Sybase 数据库服务器到链接服务器时出现问题,请按照下列步骤解决问题:
- 请确保在运行 SQL Server 的计算机上正确安装了 Sybase 客户端软件。
- 请确保在计算机上的 PATH 环境变量中包含以下路径:
- Sybase_Home_Path\bin
- Sybase_Home_Path\dll
- Sybase_Home_Path\asep
- 验证客户端计算机和服务器计算机之间的网络连接。为此,请执行以下步骤:
- 正在运行 SQL Server 的计算机,在命令提示符处,键入下面的命令,然后按 enter 键:
SybaseServerName ping
- 在 Sybase 数据库服务器,在命令提示符处,键入下面的命令,然后按 ENTER:
SQLServerName ping
如果您不能使用的服务器名称来 ping 服务器,但您可以通过使用 IP 地址连接到服务器,请联系您的网络管理员联系以解决此问题。 - 查看是否您可以通过使用您在运行 SQL Server 的计算机安装的 Sybase 客户端软件连接到 Sybase 数据库服务器。
- 如果配置分布式的事务,请确保 Microsoft 分布式事务处理协调器 (MS DTC) 服务正在运行。
- 使用sp_addlinkedsrvlogin系统存储过程将映射到正确的身份验证信息 Sybase 数据库服务器,然后再连接到 Sybase 数据库服务器。
- 若要配置并测试到 Sybase 数据库服务器的连接,请使用客户端工具。
- 正在运行 SQL Server 的计算机,在命令提示符处,键入下面的命令,然后按 enter 键:
- 请确认 ODBC DSN 相关的配置正确。
- 使用 ODBC 测试工具或类似的软件来测试 DSN 配置。
- 创建新的 Sybase 数据库服务器,DSN 然后使用新的 DSN 测试到 Sybase 数据库服务器的连接性。
- 如果 DSN 的问题没有得到解决,通过使用类似于下面的 SQL 脚本将链接的服务器添加到提供程序字符串与 Sybase 数据库服务器:
EXEC sp_addlinkedserver @server = 'Sybase Linked Server Name', @srvproduct='Sybase' @provider = 'MSDASQL' , @provstr = 'DRIVER={<Driver Name};SRVR=Sybase Server Name;UID=User Name;PWD=Strong Password'
- Microsoft 数据访问组件 (MDAC) 安装和 Sybase ODBC 驱动程序的安装验证。
- 安装最新版本的 MDAC。
数据访问技术() http://msdn.microsoft.com/en-us/library/ms810810.aspx
- 请确认下面的注册表项为 ODBC 系统 DSN 包含驱动程序路径的正确值:
< ODBC 系统 DSN > HKEY_LOCAL_MACHINE\Microsoft\Software\ODBC\odbc.ini\ \Driver
默认情况下,注册表项的值是 C:\WINNT\system32\Sysybnt.dll。
- 安装最新版本的 MDAC。
- 使用 SQL 查询分析器运行识别连接到链接服务器时可能出现的任何错误的链接服务器上的事务处理 SQL 语句。
- 运行下面的事务处理 SQL 语句,以确保 Sybase 数据库的表中可以查看:
exec sp_tables_ex 'SybaseLinkedServerName'
- 运行下面的事务处理 SQL 语句,使用由四部分组成的名称的语法和 OPENQUERY 事务处理 SQL 语句查询 Sybase 数据库服务器:
报表 1
DBCC TRACEON(3604, 7300) go SELECT * FROM SybaseLinkedServerName.DatabaseName.Owner.TableName go
语句 2
DBCC TRACEON(3604, 7300) go SELECT * FROM OPENQUERY(SybaseLinkedServerName, "Select * from DatabaseName.Owner.TableName") go
- 运行下面的事务处理 SQL 语句,以确保 Sybase 数据库的表中可以查看:
解决常见的问题
如果您从连接到 Sybase 数据库服务器的链接服务器查询数据使用 SQL 查询分析器,您可能会遇到问题。
问题 1
您会收到以下错误消息:
服务器: 消息 7399,16,状态 1 级行 1
MSDASQL 的 OLE DB 提供程序报告了一个错误。问题 2
您会收到以下错误消息:
服务器: 消息 7399,第 16 级状态 1,过程 sp_tables_ex 行 20
MSDASQL 的 OLE DB 提供程序报告了一个错误。问题 3
您会收到以下错误消息:
服务器: 消息 7399,16,状态 1 级行 1
MSDASQL 的 OLE DB 提供程序报告了一个错误。问题 4
您会收到以下错误消息:
服务器: Msg 7356 级别 16、 状态 1,行 1 OLE DB 提供程序 MSDASQL 提供的列的元数据不一致。DBCC TRACEON(7300)
问题 5
您会收到以下错误消息:
由于系统错误 126 (Sybase 系统 11),无法加载指定的驱动程序问题 6
如果您尝试链接的 Sybase 数据库服务器上运行的远程存储的过程,该链接的服务器可能会停止响应。
参考
在 SQL Server 中的链接服务器的更多信息,请访问下面的 Microsoft Web 站点:http://msdn.microsoft.com/en-us/library/aa213786.aspx有关优化分布式的查询的详细信息,请访问下面的 Microsoft Web 站点:() http://msdn.microsoft.com/en-us/library/aa213786.aspxhttp://msdn.microsoft.com/en-us/library/aa178113.aspx有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 本文讨论的第三方产品是由与 Microsoft 无关的公司生产的。() http://msdn.microsoft.com/en-us/library/aa178113.aspx
-- Adding linked server:
exec sp_addlinkedserver @server = 'server03' ,
@srvproduct = 'Sybase',
@provider = 'MSDASQL',
@datasrc = 'SQL Anywhere 12 Demo'
exec sp_addlinkedsrvlogin @useself='false ', @rmtsrvname = 'demo12',
@rmtuser = 'dba',
@rmtpassword = 'sql'
EXEC sp_linkedservers
exec sp_tables_ex 'demo12' --可以读取读取sybase asa 数据库表
--使用dbcc读取
DBCC TRACEON(3604, 7300)
go
SELECT * FROM OPENQUERY(demo12, 'Select * from demo12.GROUPO.SalesOrders')
go
--使用单独可以读取数据
SELECT * FROM OPENQUERY(demo12, 'Select * from demo12.dba.part')

___________________________________________________________________________________________________________________________________________
方法二:不使用ODBC直接使用 sysbase anywhere 的ole db 驱动来完成工作

select * from sybase..dba.part
需要配置信息为

如不配置会出现错误提示为:
备注出错
结果如下
如果使用远程链接服务器插入操作那么他的语法为:
insert into sybase..dba
查询语句使用:以下视图处理
SELECT customer_id AS 客户代号, short_name AS 客户简称, full_name AS 客户全称, linkman AS 联系人, telephone AS 电话, mob_no AS 手机,
cust_add AS 客户详细地址
FROM DEMO12..dba.customer AS customer_1
WHERE (customer_id NOT IN
(SELECT F1047
FROM dbo.tabDIYTable101))
——————————————————————————————————————————————————————————————————————————————
【SQL Server数据迁移】32位的机器:SQL Server中查询ORACLE的数据
从SQL Server中查询ORACLE中的数据,可以在SQL Server中创建到ORACLE的链接服务器来实现的,但是根据32位 、64位的机器和软件,需要用不同的驱动程序来实现。
在32位的机器上,通过访问接口:Microsoft OLE DB Provide for Oracle,来实现。
1、机器环境和软件环境
机器是一台虚拟机,安装了windows xp,SQL Server 20008R2,Oracle 10g 10.2.0.1.0。
2、ORACLE环境的设置
连接oracle:
- C:\Documents and Settings\Administrator>sqlplus / as sysdba
-
- SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 3月 13 15:22:29 2014
-
- Copyright (c) 1982, 2005, Oracle. All rights reserved.
-
-
- 连接到:
- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
- With the Partitioning, OLAP and Data Mining options
修改scott用户的密码为tiger,并给账户解锁,尝试登录,查询表:
- SQL> alter user scott identified by tiger;
-
- 用户已更改。
-
- SQL> alter user scott account unlock;
-
- 用户已更改。
-
- SQL> connect scott/tiger
- 已连接。
- SQL> select count(*) from emp;
-
- COUNT(*)
- ----------
- 14
查看listener.ora是否正确:
- # listener.ora Network Configuration File: C:\oracle\product\10.2.0\db_1\network\admin\listener.ora
- # Generated by Oracle configuration tools.
-
- SID_LIST_LISTENER =
- (SID_LIST =
- (SID_DESC =
- (SID_NAME = PLSExtProc)
- (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
- (PROGRAM = extproc)
- )
- (SID_DESC =
- (GLOBAL_DBNAME=orcl)
- (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
- (SID_NAME =orcl)
- )
- )
-
- LISTENER =
- (DESCRIPTION_LIST =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
- (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
- )
- )
要特别注意里面的:
(SID_DESC =
(GLOBAL_DBNAME=orcl)
(ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
(SID_NAME =orcl)
)
另外,查看tnsnames.ora是否正确:
- # tnsnames.ora Network Configuration File: C:\oracle\product\10.2.0\db_1\network\admin\tnsnames.ora
- # Generated by Oracle configuration tools.
-
- ORCL =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
- (CONNECT_DATA =
- (SERVER = DEDICATED)
- (SERVICE_NAME = orcl)
- )
- )
-
- EXTPROC_CONNECTION_DATA =
- (DESCRIPTION =
- (ADDRESS_LIST =
- (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
- )
- (CONNECT_DATA =
- (SID = PLSExtProc)
- (PRESENTATION = RO)
- )
- )
特别是:
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
查看监听器的状态是否正常:
- SQL> host lsnrctl status
-
- LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 13-3月 -2014 15:23:31
-
- Copyright (c) 1991, 2005, Oracle. All rights reserved.
-
- 正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
- LISTENER 的 STATUS
- ------------------------
- 别名 LISTENER
- 版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
- 启动日期 13-3月 -2014 14:20:27
- 正常运行时间 0 天 1 小时 3 分 6 秒
- 跟踪级别 off
- 安全性 ON: Local OS Authentication
- SNMP OFF
- 监听程序参数文件 C:\oracle\product\10.2.0\db_1\network\admin\listener.ora
- 监听程序日志文件 C:\oracle\product\10.2.0\db_1\network\log\listener.log
- 监听端点概要...
- (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))
- (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
- 服务摘要..
- 服务 "PLSExtProc" 包含 1 个例程。
- 例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
- 服务 "orcl" 包含 1 个例程。
- 例程 "orcl", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
- 命令执行成功
3、设置链接服务器。
需要特别注意的是,数据源orcl指的是:tnsnames.ora文件中的orcl服务名。
第一步,选择“新建链接服务器”:

第二步,一定要选择 Microsoft OLE DB Provide for Oracle:

第三步,输入产品:oracle,数据源:orcl:

第四步,输入oracle的用户名和密码,这个需要根据实际情况设置,输入完后,点确定就好:

4、测试查询
- select * from openquery(xxx, 'SELECT * FROM emp')
返回结果:

5、用代码实现:
- EXEC master.dbo.sp_addlinkedserver
- @server = N'ORACLE_SCOTT',
- @srvproduct=N'ORACLE',
- @provider=N'MSDAORA',
- @datasrc=N'orcl'
- go
-
- /* For security reasons the linked server remote logins password is changed with ######## */
- EXEC master.dbo.sp_addlinkedsrvlogin
- @rmtsrvname=N'ORACLE_SCOTT',
- @useself=N'False',
- @locallogin=NULL,
- @rmtuser=N'scott',
- @rmtpassword='tiger'
- GO
-
-
- select * from openquery(xxx, 'SELECT * FROM scott.emp')
6、通过openrowset函数来实现,更简单。
- select *
- from openrowset('MSDAORA','orcl';'scott';'tiger','select * from SCOTT.EMP')
-- Adding linked server:
exec sp_addlinkedserver @server = 'server03' ,
@srvproduct = 'Sybase',
@provider = 'MSDASQL',
@datasrc = 'SQL Anywhere 12 Demo'
exec sp_addlinkedsrvlogin @useself='false ', @rmtsrvname = 'demo12',
@rmtuser = 'dba',
@rmtpassword = 'sql'
EXEC sp_linkedservers
exec sp_tables_ex 'demo12' --可以读取读取sybase asa 数据库表
--使用dbcc读取
DBCC TRACEON(3604, 7300)
go
SELECT * FROM OPENQUERY(demo12, 'Select * from demo12.GROUPO.SalesOrders')
go
--使用单独可以读取数据
SELECT * FROM OPENQUERY(demo12, 'Select * from demo12.dba.part')
___________________________________________________________________________________________________________________________________________
方法二:不使用ODBC直接使用 sysbase anywhere 的ole db 驱动来完成工作
select * from sybase..dba.part
需要配置信息为
如不配置会出现错误提示为:
备注出错
结果如下
如果使用远程链接服务器插入操作那么他的语法为:
insert into sybase..dba
查询语句使用:以下视图处理
SELECT customer_id AS 客户代号, short_name AS 客户简称, full_name AS 客户全称, linkman AS 联系人, telephone AS 电话, mob_no AS 手机,
cust_add AS 客户详细地址
FROM DEMO12..dba.customer AS customer_1
WHERE (customer_id NOT IN
(SELECT F1047
FROM dbo.tabDIYTable101))
——————————————————————————————————————————————————————————————————————————————
【SQL Server数据迁移】32位的机器:SQL Server中查询ORACLE的数据
从SQL Server中查询ORACLE中的数据,可以在SQL Server中创建到ORACLE的链接服务器来实现的,但是根据32位 、64位的机器和软件,需要用不同的驱动程序来实现。
在32位的机器上,通过访问接口:Microsoft OLE DB Provide for Oracle,来实现。
1、机器环境和软件环境
机器是一台虚拟机,安装了windows xp,SQL Server 20008R2,Oracle 10g 10.2.0.1.0。
2、ORACLE环境的设置
连接oracle:
- C:\Documents and Settings\Administrator>sqlplus / as sysdba
- SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 3月 13 15:22:29 2014
- Copyright (c) 1982, 2005, Oracle. All rights reserved.
- 连接到:
- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
- With the Partitioning, OLAP and Data Mining options
修改scott用户的密码为tiger,并给账户解锁,尝试登录,查询表:
- SQL> alter user scott identified by tiger;
- 用户已更改。
- SQL> alter user scott account unlock;
- 用户已更改。
- SQL> connect scott/tiger
- 已连接。
- SQL> select count(*) from emp;
- COUNT(*)
- ----------
- 14
查看listener.ora是否正确:
- # listener.ora Network Configuration File: C:\oracle\product\10.2.0\db_1\network\admin\listener.ora
- # Generated by Oracle configuration tools.
- SID_LIST_LISTENER =
- (SID_LIST =
- (SID_DESC =
- (SID_NAME = PLSExtProc)
- (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
- (PROGRAM = extproc)
- )
- (SID_DESC =
- (GLOBAL_DBNAME=orcl)
- (ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
- (SID_NAME =orcl)
- )
- )
- LISTENER =
- (DESCRIPTION_LIST =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
- (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
- )
- )
要特别注意里面的:
(SID_DESC =
(GLOBAL_DBNAME=orcl)
(ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
(SID_NAME =orcl)
)
另外,查看tnsnames.ora是否正确:
- # tnsnames.ora Network Configuration File: C:\oracle\product\10.2.0\db_1\network\admin\tnsnames.ora
- # Generated by Oracle configuration tools.
- ORCL =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
- (CONNECT_DATA =
- (SERVER = DEDICATED)
- (SERVICE_NAME = orcl)
- )
- )
- EXTPROC_CONNECTION_DATA =
- (DESCRIPTION =
- (ADDRESS_LIST =
- (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
- )
- (CONNECT_DATA =
- (SID = PLSExtProc)
- (PRESENTATION = RO)
- )
- )
特别是:
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
查看监听器的状态是否正常:
- SQL> host lsnrctl status
- LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 13-3月 -2014 15:23:31
- Copyright (c) 1991, 2005, Oracle. All rights reserved.
- 正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
- LISTENER 的 STATUS
- ------------------------
- 别名 LISTENER
- 版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
- 启动日期 13-3月 -2014 14:20:27
- 正常运行时间 0 天 1 小时 3 分 6 秒
- 跟踪级别 off
- 安全性 ON: Local OS Authentication
- SNMP OFF
- 监听程序参数文件 C:\oracle\product\10.2.0\db_1\network\admin\listener.ora
- 监听程序日志文件 C:\oracle\product\10.2.0\db_1\network\log\listener.log
- 监听端点概要...
- (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))
- (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
- 服务摘要..
- 服务 "PLSExtProc" 包含 1 个例程。
- 例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
- 服务 "orcl" 包含 1 个例程。
- 例程 "orcl", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
- 命令执行成功
3、设置链接服务器。
需要特别注意的是,数据源orcl指的是:tnsnames.ora文件中的orcl服务名。
第一步,选择“新建链接服务器”:
第二步,一定要选择 Microsoft OLE DB Provide for Oracle:
第三步,输入产品:oracle,数据源:orcl:
第四步,输入oracle的用户名和密码,这个需要根据实际情况设置,输入完后,点确定就好:
4、测试查询
- select * from openquery(xxx, 'SELECT * FROM emp')
返回结果:
5、用代码实现:
- EXEC master.dbo.sp_addlinkedserver
- @server = N'ORACLE_SCOTT',
- @srvproduct=N'ORACLE',
- @provider=N'MSDAORA',
- @datasrc=N'orcl'
- go
- /* For security reasons the linked server remote logins password is changed with ######## */
- EXEC master.dbo.sp_addlinkedsrvlogin
- @rmtsrvname=N'ORACLE_SCOTT',
- @useself=N'False',
- @locallogin=NULL,
- @rmtuser=N'scott',
- @rmtpassword='tiger'
- GO
- select * from openquery(xxx, 'SELECT * FROM scott.emp')
6、通过openrowset函数来实现,更简单。
- select *
- from openrowset('MSDAORA','orcl';'scott';'tiger','select * from SCOTT.EMP')