首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

?碰到奇怪现象:远程连接找不到

2013-11-15 
?????遇到奇怪现象:远程连接找不到。明明已经连接远程DB了,但是总是提示[在sys.servers里找不到远程DB连接S

?????遇到奇怪现象:远程连接找不到。
明明已经连接远程DB了,但是总是提示[在sys.servers里找不到远程DB连接SUBLNK]。
但是如果把[第一段  开始]~[第一段  结束]的代码屏蔽掉的话,则可以顺利执行。
为什么加了第一段就不行了。
---------------第一段  开始---------------------------------------------------
USE [ABCDB]
GO

IF (EXISTS (SELECT * FROM SYS.OBJECTS WHERE NAME = 'SP_COPYDATAFROMSUBDB'))
    DROP PROCEDURE SP_COPYDATAFROMSUBDB
GO

CREATE PROCEDURE [dbo].[SP_COPYDATAFROMSUBDB]
AS
---------------第一段  结束---------------------------------------------------

---------------------------------远程DB连接---------------------------------
EXEC master.dbo.SP_ADDLINKEDSERVER 'SUBLNK', '','SQLNCLI',N'JCAPP\JCSQLSERVER12R2'
EXEC master.dbo.SP_ADDLINKEDSRVLOGIN 'SUBLNK','false ',NULL, 'sa', 'sa_12345678'
GO

SELECT COUNT(1) FROM SUBLNK.SUBDB.DBO.M_CLIENT WHERE CLIENT_CODE = 'C0101'

EXEC SP_DROPSERVER 'SASLNK ', 'droplogins'
GO
[解决办法]
距我了解,不行,\这个问题可以用:
[HIAPPSRV\JCSQLSERVER201212_R2]来解决
[解决办法]

引用:
Quote: 引用:

创建linkserver的语句和查询的不能同时放到一个sp里面
就是linkserver 还没有创建呢,但是查询语句还是会去判断一下对象
似乎是这样的逻辑,导致编译出错了
你这样做也米有什么意义,密码岂不是都被看到了
如果只用一次使用的话,直接用openrowset

执行粗略的划分,是两个过程,先生成执行计划,再根据这个计划执行
生成执行计划的时候,你的链接服务器还没有建呢,但
后面用到的链接服务器的对象,在编译期间是要取得一些信息的,
但这个时候因为没有执行,
所以没有链接服务器,所以拿不到信息,自然就出错了

被无视了吗?呵呵
[解决办法]
既然不能编译通过,何不先创建此链接
然后待创建存储过程后删除该链接
[解决办法]
引用:
阳泉酒家小当家,多谢热心帮助啊,按照你的试了一下,一样的错误。
Could not find server 'SUBLNK' in sys.servers. Verify that the correct server name was specified. If necessary, execute the stored procedure sp_addlinkedserver to add the server to sys.servers.


呵呵,我知道问题在哪儿了:

我做了一个实验:
1.下面的代码报错了
--建立链接服务器,通过@datasrc指定数据源,适合链接其他多种数据库
EXEC master.dbo.sp_addlinkedserver @server = N'Link1',
                                   @srvproduct='ms', 
                                   @provider=N'SQLNCLI',                                    
                                   @datasrc=N'192.168.1.106,1433'

EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'Link1',
                                    @useself=N'False',
                                    @locallogin=NULL,
                                    @rmtuser=N'sa',
                                    @rmtpassword='yupeigu'
  
                                    
--查询远程表
select * 
from [Link1].test.dbo.t1
/*
消息 7202,级别 11,状态 2,第 18 行
在 sys.servers 中找不到服务器 'Link1'。请验证指定的服务器名称是否正确。
如果需要,请执行存储过程 sp_addlinkedserver 以将服务器添加到 sys.servers。
*/


2.在创建连接服务器后,在select 连接服务器之间,加了一个go,就不报错了,这说明了一个问题,就是连接服务器,在用之前,必须已经存在,而且创建连接服务器、和使用连接服务器,不能在一个批处理中,也就是必须要加一个go语句,这样就成了2个批处理了:

--建立链接服务器,通过@datasrc指定数据源,适合链接其他多种数据库
EXEC master.dbo.sp_addlinkedserver @server = N'Link2',
                                   @srvproduct='ms', 


                                   @provider=N'SQLNCLI',                                    
                                   @datasrc=N'192.168.1.106,1433'

EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'Link2',
                                    @useself=N'False',
                                    @locallogin=NULL,
                                    @rmtuser=N'sa',
                                    @rmtpassword='yupeigu'
  
go
                                    
--查询远程表
select * 
from [Link2].test.dbo.t1
/*
idv
7NULL
9NULL
1aa
2bb
3cc
4dd
5ee
6ff
8gg
*/



3.所以,建议你采用上面提到的方面,就是先建立连接服务器,然后再使用,比如现在存储过程之外建立连接服务器,然后再存储过程中使用。

热点排行