工作当中有同时用到SQL Server和Oracle的情况,在无法使用web service的情况下,如果需要在SQL Server中直接访问Oracle数据库,那么SQL Server有提供相应的功能,即链接服务器。
下面说一下如何创建链接服务器和远程操作Oracle数据库。以下操作假定已经在本机配置好对远端Oracle数据库的访问。
在SQL数据库的服务器对象下有链接服务器,如下图所示:
右键单击,选择“新建链接服务器”,弹出窗口:
“常规”选项卡
链接服务器:可以自定义输入
服务器类型:选择其他数据源
访问接口:选择"Microsoft OLE DB Provider for Oracle"
产品名称:输入"Oracle"
数据源:输入Oracle在本机器的服务名称,即tnsnames文件中的服务名
“安全性”选项卡
选择使用此安全上下文建立连接
输入Oracle数据库的用户名和密码
点击确定,即创建链接服务器。
以查询为例,远程调用有两种方法:
第一:使用SQL Server的内置函数openquery(http://technet.microsoft.com/zh-cn/library/ms188427.aspx)
select * from openquery(ORCL ,'select * from sysuser')
openqeury函数的第一个参数为链接服务器的名称,第二个参数为查询语句(符合Oracle语法)
第二种方法:直接进行查询
select * from ORCL..SYSTEM .SYSUSER
from后面的第一个参数为链接服务器名称,第二个参数为用户名,第三个为Oracle中的数据表,这里用的是SQL语法,注意一定要大写,否则会报错
那么,这两种写法的区别是什么呢,我们看一下执行计划
一个是远程扫描,一个是远程查询,开销是一样的。
再计算一下执行时间吧
分别执行100次的查询,看耗费多长时间
declare @time datetime, @count int set @count = 1 set @time = GETDATE() select * from openquery(ORCL ,'select * from sysuser') while @count < 100 begin select * from openquery(ORCL ,'select * from sysuser') set @count = @count + 1 end select DATEDIFF (ms, @time,getdate ())
再替换测试语句二
一共执行五次,结果为:
7910 8783
7866 8856
7976 8793
7856 8860
7910 8833
由此可见,第一种查询方法比第二种查询方法稍快一些
上述的测试是Oracle和SQL Server在同一台机器上的情况,如果分布在不同的服务器上,那么执行时间可能会更长。
以上,做个简单的记录,以备后查