[转载]跨服务器连接查询(补充) - select left('claro',2)的专栏 - 博客频道 - CSDN.NET

[转载]跨服务器连接查询(补充) – select left(‘claro’,2)的专栏 – 博客频道 – CSDN.NET.

如何方便的建立远程链接服务器   的文章中说明如何在SQL2005环境下方便快捷有效的建立跨服务器查询;

 

-- 很多朋友问局域网多数据库服务器访问该如何操作?下面简单说明如何配置远程链接访问。

/*********** 环境说明 ***********/

-- 源机器 IP 为 10. 0.0.211 ,在该机器所在数据库建立与目标机器的远程数据库链接。

-- 目标机器 IP 为 10. 0.0.222 。

-- 步骤(一)是指直接用 IP 进行远程链接,个人觉得用 IP 链接虽然麻烦,但是直观而且在多服务器操作时不会出现误链接的情况。

-- 步骤(二)是指直接用别名进行远程链接,较方便;但在高压力,大脑暂时短路情况下容易出现误链接数据库情况发生。

 

/*********** 步骤(一) ***********/

-- 建立连接服务器

EXEC sp_addlinkedserver   '10.0.0.222' , 'SQL Server'

 

/*-- 如果数据库有架构名需要做远程登录之间的映射

-- 创建链接服务器上远程登录之间的映射

EXEC sp_addlinkedsrvlogin '10.0.0.222','false','SA',' 架构名 ',' 登录密码 '

*/

-- 查询数据

-- 含架构名

select top 10 * from [10.0.0.222]. 数据库名 . 架构名 . 表名

-- 不含架构名

select top 10 * from [10.0.0.222]. 数据库名 . dbo. 表名

 

 

-- 查看链接服务器信息

select name , product, provider, data_source, query_timeout, lazy_schema_validation, is_remote_login_enabled, is_rpc_out_enabled

  from sys.servers

where is_linked= 1

 

/*********** 建立步骤(二) ***********/

/*-- 如果用 IP 连接觉得麻烦,可以新建别名

-- 配置链接服务器属性

exec sp_serveroption '222','name','10.0.0.222'

*/

-- 查询数据

-- 含架构名

select top 10 * from 222. 数据库名 . 架构名 . 表名

-- 不含架构名

select top 10 * from 222. 数据库名 . dbo. 表名

 

 

-- 删除链接服务器登录名映射

exec sp_droplinkedsrvlogin '10.0.0.222' ,NULL

 

-- 删除链接服务器属性

exec sp_dropserver '222'

 

--注:如果执行 删除链接服务器时提示如下错误时,

消息 15190,级别 16,状态 1,过程 sp_dropserver,第 56 行
仍有对服务器 'XXXX' 的远程登录或链接登录。

执行

exec sp_dropserver ' 链接服务器 ' , 'droplogins' 

SQL2008和SQL2000可以跨服务器连接查询的测试实例   中说明如何在SQL2000和SQL2008环境下跨服务器的查询。

 

以上跨服务器查询都是在先建立链接服务器的基础上,

如果不建立链接服务器可以直接用SQL查询跨服务器的Table吗?

如果不建立链接服务器可以查询跨服务器的系统表吗?

 

当然可以!

SQL2008和SQL2000可以跨服务器连接查询的测试实例 中的各实例对应的sa如何不相同,建立链接服务器后仍无法查询系统表,所以这里强调可以查询跨服务器的系统表并告诉使用它的目的。

 

当然,我们都熟悉opendatasource的使用,这里也不例外。

环境:

目标服务器SERV1,IP地址10.0.0.250,数据库INTER,架构名DBO

目的:

在本地服务器查询目标服务器上的INTER数据库的表logdb。

 

脚本一:

查询服务器SERV1上INTER数据库的表logdb并返回前十行

select top 10 *

from opendatasource ( ‘SQLOLEDB’

, ‘Data Source=10.0.0.250;User ID=sa;PASSWORD=sa 密码 ;’ )   输入目标服务器地址(原因请见《如何方便的建立远程链接服务器》)

输入 sa 帐号及密码

. [INTER] . dbo . logdb

  如果结果 返回类似如下结果:

链接服务器”(null)”的 OLE DB 访问接口 “SQLNCLI10” 返回了消息 “登录超时已过期”。
链接服务器”(null)”的 OLE DB 访问接口 “SQLNCLI10” 返回了消息 “与 SQL Server 建立连接时发生了与网络相关的或特定于实例的错误。找不到或无法访问服务器。请检查实例名称是否正确以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 联机丛书。”。
消息 53,级别 16,状态 1,第 0 行
命名管道提供程序: 无法打开与 SQL Server 的连接 [53].

  请检查并确认输入的目标服务器地址及SA密码是否正确!

 

如果结果 返回类似如下结果:

 

消息 7314 ,级别 16 ,状态 1 ,第 1

链接服务器 “(null)” OLE DB 访问接口 “SQLNCLI10” 不包含表 “”INTERFACEDATA”.”dbo”.”logdb”” 。该表不存在,或者当前用户没有访问该表的权限。

  请检查并确认输入的表名是否正确!

 

 

 

脚本二:

这里我们假设输入的表名是错的,但不记得正确的表名是什么。此时通常我们会查询sys.objects是否存在该表并确认名称。这里也不例外:

查询服务器SERV1上INTER数据库中是否存在表 db log并返回正确的表名

select NAME

from opendatasource ( ‘SQLOLEDB’

, ‘Data Source=10.0.0.250;User ID=sa;PASSWORD=sa 密码 ;’ )

. [INTER] . [SYS] . [OBJECTS] 查询目标服务器的系统表

where TYPE = ‘U’ and NAME LIKE ‘%log’ 查询用户表以 “log” 结尾的表名

ORDER BY 1  NAME 排序

 

 

 

Posted by: select left(‘claro’,2) @10:27:00

lable: SQL

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏