-- 开启分布式查询
EXECsp_configure'show advanced options', 1; GO
RECONFIGURE; GO
EXECsp_configure'Ad Hoc Distributed Queries', 1 GO
RECONFIGURE; GO
--sqlserver 链接oracle可以通过两个访问接口: 'MSDAORA'和'OraOLEDB.Oracle'
--首先讲第一种,“MSDAORA”访问接口是由Microsoft OLE DB Provider for Oracle提供的,这里建议不使用此接口进行链接。通过该访问接口建立的链接服务器在进行查询oracle表(带数据类型CLOB、BLOB字段)时会报这个错误:数据类型不支持。当然,如果不需要选择这样的数据类型时,可以使用这个接口。
SELECT*FROMOPENROWSET('MSDAORA','192.168.9.12';'test';'test','SELECT * FROM USER where USERNO=''ADMIN''')asA
--第二种,“OraOLEDB.Oracle”访问接口是由oracle 的Oracle Probider for OLE DB 驱动提供的。它解决了两个数据库类型不一致的的问题。
SELECT*FROMOPENROWSET('OraOLEDB.Oracle','192.168.9.12';'test';'test','SELECT * FROM USER where USERNO=''ADMIN''')asA
-- 关闭分布式查询
execsp_configure'Ad Hoc Distributed Queries',0 GO
reconfigure GO
execsp_configure'show advanced options',0 GO
reconfigure GO
会出现的问题:
1, 第一次在本地实验,本机上装的是SQL2000以及SQL2008R2,都是32位的。OracleClient
装的是11G 32位的,刚开始在SQL2000上执行以上开启分布式查询的语句时,出现一下错误:
配置选项 'Ad Hoc Distributed Queries' 不存在,也可能是高级选项。
以为是SQL2000不支持这个选项,所以我就直接换到SQL2008那里使用,链接查询,顺利得到数据。
在服务器上配置的时候(服务器上装的是SQL2014),刚开始不知道是64位还是32位的,以为也能顺利的访问到oracle。结果两种方式都试了好几次,都报错。具体错误忘记了,大概意
思是:找不到'MSDAORA'和'OraOLEDB.Oracle'这两个注册。
百度之后,尝试用另一种方式:添加链接服务器。这个暂且先略过,之后在介绍。主要介绍前面两种方式。为什么找不到这两个注册,我就去管理工具里查看ODBC数据源。里面有两个版本的,32位的和64位的。通过对比发现,本地的32位上多了这两个东西,服务器上面没有。但是服务器上安装了同样的oracle客户端,为什么没有这个oracle的驱动程序呢,这时候
才想起来SQL的版本问题。
用SELECT @@VERSION这个命令查看sql的版本,发现服务器的SQLServer是64位的。所以应该要用64位的OracleClient版本(MSDAORA没有64位版本存在)。于是到Oracle官网上下载了64位的64-bit Oracle Data Access Components (ODAC) for Windows链接地址:
http://www.oracle.com/technetwork/database/windows/downloads/index-090165.html 根据Oracle的版本下载相应的程序,安装(安装之前最好看一下readme.txt,根据说明安装)。安装完成之后发现还是报无法找到'OraOLEDB.Oracle'注册这个错误,于是手工注册了下安装目录下的OraOLEDB11.DLL,下安装结果还是不行。又做了各种尝试,还是不行。 是不是因为没有重启,所以安装没有生效?但是因为是服务器没法马上重启,在第二天重启之后,再使用最开始的方法,就可以成功访问到oracle的数据了。
关于添加链接服务器:
1, 添加的时候找不到'OraOLEDB.Oracle'注册,有可能是因为没有安装正确的版本,记
得安装完后重启,再试。
如果还是不行,看访问接口下面是不是有这一项,如果没有,到注册表下面添加这个项,具体参看:http://jingyan.http://www.wodefanwen.com//article/546ae18560adcc1149f28cc1.html
之后就可以在访问接口中可以看到该选项,在链接服务器-访问接口-OraOLEDB.Oracle右键属性,查看”允许进程内”(英文版的为:Allow inprocess)是否选中,如果没有,勾上。
有些乱,只为记录2天的折腾。还有下次不会忘记。
参考:
http://www.mamicode.com/info-detail-493444.html
https://powerbi.microsoft.com/en-us/blog/39-oraoledb-oracle-39-provider-is-not-registered/ http://blog.sina.com.cn/s/blog_614b6f210100t80r.html https://blogs.msdn.microsoft.com/apgcdsd/2011/05/24/linked-serverssisoracle/