各位老铁们好,相信很多人对sql跨服务器查询都不是特别的了解,因此呢,今天就来为大家分享下关于sql跨服务器查询以及SERVER跨服务器查询数据库的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
一、sql怎样跨数据库查询oracle
假定您现在拥有一个以Microsoft.NET为架构的网络订购系统,但是品管维护系统却仍然使用一套旧式的Oracle数据库应用程序。当您的顾客在产品保固期间下了产品更换之类的订单,则该笔订单将不收取任何费用。此时您需要从Oracle数据库得到实时的查询结果。借着建立连结服务器的方式(linkedServer),您将可以从SQLServer实时查询出位于Oracle数据库的顾客资料,找出谁是您既有的客户。
当您的资料分散在不同的SQLServer数据库时,藉由连结服务器可让您执行跨服务器之分布式查询。当所有的数据库服务器都是SQLServer,则连结服务器的设定十分容易,而且在SQLServer线上手册中就涵盖了您所需要了解的所有事项。然而,当部分资料是放在Oracle数据库服务器的时候,这就可能带给您许多挑战。举例来说,光是设定连结服务器就不是一件容易的事。您必须了解到:即是您要在SQLServer的EnterpriseManager设定一个Oracle连结服务器,这台SQLServer对Oracle来说就是一个客户端。所以您必须在SQLServer所在的服务器成功地安装并组态Oracle之客户端软件。因为Oracle提供的产品只支持Oracle8以后的数据库,所以我假设您正在使用的都是Oracle8以后的数据库。在OracleNet8函式库则提供了SQLServer所需要的客户端软件。
设定连接服务器时是利用Microsoft所提供的OLEDB ProviderforOracle,使用的Oracle网络函式库为SQL*Net2.3.3.0.4或是以后的版本,不过这是Oracle7.3数据库所提供的。换句话说,要设定Oracle数据库为SQLServer的连接服务器时,Oracle数据库只要是7.3.3.4以后的版本,并搭配适当的SQL*Net或是Net8函式库即可。
在Oracle数据库中,一个schema即代表着SQLServer专家们所熟知的单一数据库(译者注2)。连接至Oracle数据库时,您必须提供schema名称、密码以及主机联机字符串(hoststring)。每一个特定的Oracle帐户都拥有一个Oracleschema,而且只能有一个schema。所以schema名称其实就等于该schema拥有者的帐户名称。您可以查询Oracle的资料字典(Datadictionary)以得到更多有关schema的内容。
至于Oracle联机字符串又可称为服务名称(servicename)或是系统识别资料(SystenIdentifier,SID)。我们所谓的SQLServer数据库个体(instance)在Oracle则称为数据库(database)。所以安装OracleServer时,安装程序OracleUniversalInstaller(为一个图形接口之安装程序,与SQLServer的Setup程序类似)将会询问您SID名称为何,以作为Oracle数据库之名称。
这个部分原作者所提到schema的解释有点问题。Oracleschema可视为同一个使用者所拥有的所有数据库对象(schemaobjects)之集合。举例来说,使用者scott所建立的EMPtable其完整名称为SCOTT.EMP,而SCOTT就是EMP的schema名称。所以schemaname其实就是一个Oracle数据库之使用者帐号。但是绝对不能拿来跟数据库相提并论!因为SQLServer的数据库架构包含了datafiles与logfiles,但是Oracle的schemaobjects只存在于tablespace中。为了避免部分读者产生混淆,特此说明。
二、如何在SQL***SERVER跨服务器查询数据库
--创建服务器
exec sp_addlinkedserver'ITSV','','SQLOLEDB','远程服务器名或ip'
exec sp_addlinkedsrvlogin'ITSV','false',null,'用户名','密码'
--查询示例
select* from ITSV.数据库名.dbo.表名
--导入示例
select* into表 from ITSV.数据库名.dbo.表名
--以后不再使用时删除服务器
exec sp_dropserver'ITSV','droplogins'
--连接远程/局域网数据(openrowset/openquery/opendatasource)
--1、openrowset
--查询示例
select* from openrowset('SQLOLEDB','sql服务器名';'用户名';'密码',数据库名.dbo.表名)
--生成本地表
select* into表 from openrowset('SQLOLEDB','sql服务器名';'用户名';'密码',数据库名.dbo.表名)
--把本地表导入远程表
insert openrowset('SQLOLEDB','sql服务器名';'用户名';'密码',数据库名.dbo.表名)
select*from本地表
--更新本地表
update b
set b.列A=a.列A
from openrowset('SQLOLEDB','sql服务器名';'用户名';'密码',数据库名.dbo.表名)as a inner join本地表 b
on a.column1=b.column1
--openquery用法需要创建一个连接
--首先创建一个连接创建服务器
exec sp_addlinkedserver'ITSV','','SQLOLEDB','远程服务器名或ip'
--查询
select*
FROM openquery(ITSV,'SELECT* FROM数据库.dbo.表名')
--把本地表导入远程表
insert openquery(ITSV,'SELECT* FROM数据库.dbo.表名')
select* from本地表
--更新本地表
update b
set b.列B=a.列B
FROM openquery(ITSV,'SELECT* FROM数据库.dbo.表名') as a
inner join本地表 b on a.列A=b.列A
--3、opendatasource/openrowset
SELECT*
FROM opendatasource('SQLOLEDB','Data Source=ip/ServerName;User ID=登陆名;Password=密码').test.dbo.roy_ta
--把本地表导入远程表
insert opendatasource('SQLOLEDB','Data Source=ip/ServerName;User ID=登陆名;Password=密码').数据库.dbo.表名
select* from本地表
三、SQLServer的跨库查询的实现方法
本文给出了一个SQL语句,用于在同一服务器上显示不同数据库之间的查询。注意,当前连接用户拥有对所有两个库的权限。
SQLServer中sql语句中对象的完整表达式为:
{服务器}。{语句},{ DatabaseSchema},{ DatabaseObject}
在本文中,使用SQL语句显示同一服务器上不同数据库之间的查询。值得注意的是,当前连接用户可以访问两个库。
复制代码代码如下所示:
选择*
从cfteadb1.dbo.cfteatable1内加入cfteadb2.dbo.cfteatable2
在cfteadb1。dbo。cfteatable1 ID= cfteadb2.dbo.cfteatable2.id。
以上已在SQL Server 2008 R2的管理库中成功地进行了测试。
以下是一些补充信息
未使用的服务器名称,并且作为对象名称的四部分的一部分提供了特殊的连接信息。
语法
OPENDATASOURCE(provider_name,init_string)
参数
provider_name
的ProgID,注册为OLE DB提供程序用于访问数据源的名称,provider_name数据类型char和没有默认值。
init_string
连接字符串,它将被传递给目标供应商IDataIntialize接口。提供程序字符串的语法是基于关键字-值对,其中由分号分隔的,如中=价值;关键词=价值。
基本语法的定义是在微软(R)的数据访问,在特定的关键字值对所支持的信息,在供应商看到文件。下表列出了在init_string参数最常用的关键词。
关键词
OLE DB属*
有效值和描述
数据源
dbprop_init_datasource
数据源的名称有联系的。不同的供应商不同的方式解释它,SQL Server OLE DB提供者,这将指定服务器的名称。对射流的OLE DB提供程序,这将表明的全路径.mdb文件或.xls文件。
位置
dbprop_init_location
要连接的数据库的位置。
扩展属*
dbprop_init_providerstring
提供特定于程序的连接字符串。
连接超时
dbprop_init_timeout
超时值,超时值之后,连接尝试将失败。
用户ID
dbprop_auth_userid
连接的用户ID。
密码
dbprop_auth_password
用于连接的密码。
目录
dbprop_init_catalog
连接到数据源的初始或默认目录名。
笔记
OPENDATASOURCE函数可以用在同一个位置,可以使用Transact-SQL语法的服务器的名称。因此,OPENDATASOURCE可以作为四部分的名字的第一部分,指的是在选择,插入的表或视图的名称,更新或删除语句,或是指远程存储过程在执行语句。当远程存储过程执行时,指的是另一个SQL server.opendatasource OPENDATASOURCE应该不接受参数变量。
类似于OPENROWSET函数OPENDATASOURCE应该仅指OLE DB数据源不经常访问的数据源。任何有一点接入,定义服务器。既不可如openrowset OPENDATASOURCE提供的服务器,连接定义的所有功能,安全管理和查询目录信息的能力。每次调用OPENDATASOURCE时,所有的连接信息(包括密码)必须提供。
样品
下面的示例访问SQLServer另一个实例中的表中的数据。
复制代码代码如下所示:
*选择
从OPENDATASOURCE(
SQLOLEDB。
数据源=%ServerName;用户ID= myuid;密码= mypass
Northwind. dbo.类别)
下面是一个查询,通过OLE DB提供程序查询Excel电子表格的查询示例。
复制代码代码如下所示:
*选择
从OPENDATASOURCE('microsoft。飞机。OLEDB。4。
数据源=C:财务帐户。XLS;用户ID=管理员;密码=;扩展属*= Excel 5)…xactions