日期:2014-05-17  浏览次数:20439 次

?????遇到奇怪现象:远程连接找不到。
明明已经连接远程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',                                    
                      &nb