SQLServer2005连接远程数据库问题

时间:2023-01-26 04:35:16
我在项目中需要访问远程数据库,用来更新本地库,现在的想法是建立一个存储过程,每天在本地执行来更新,代码如下:
USE [BQCK]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create procedure [dbo].[p_renshigengxin]
as 

--创建远程连接
exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '192.168.1.99 '  
GO
exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, 'sa ', 'brahminu8'  
GO
delete renyuanjichu
GO
--插入数据
insert into BQCK.dbo.+++++++++++++++++++代码

如上图,在“--创建远程连接”以下的代码在查询分析器直接运行都是对的,但是一旦像上面这样封装到存储过程中了就报错
服务器 'ITSV ' 不存在。请使用 sp_helpserver 来显示可用的服务器。
或者
在 sys.servers 中找不到服务器 'ITSV'。请验证指定的服务器名称是否正确。

11 个解决方案

#1


樓主,可以參考:
e.g.
use master
GO
if object_id('sp_AddLinkServer') Is Not Null
Drop proc sp_AddLinkServer
Go  

Create proc sp_AddLinkServer
(
@LinkServerName nvarchar(128),
@DataBaseInstance nvarchar(128),
@User nvarchar(128),
@Pwd nvarchar(128)
)
As

If Exists(Select 1 From sys.servers Where name=@LinkServerName)
Exec sys.sp_dropserver 
@server = @LinkServerName,
@droplogins = 'droplogins' --移除 server 的相關遠端和連結伺服器登入

--添加連接伺候器
Exec sys.sp_addlinkedserver 
@server = @LinkServerName,
@srvproduct = 'MYLINK', --產品名稱,不能設置為"SQL Server"值,不然報錯
@provider = N'SQLNCLI',
@datasrc = @DataBaseInstance,
@location = Null,
@provstr = Null, 
@catalog = Null

--對伺候器添加登錄用戶&密碼
 Exec sys.sp_addlinkedsrvlogin 
 @rmtsrvname = @LinkServerName, 
 @useself = N'False',
 @locallogin = Null,
 @rmtuser = @User, 
 @rmtpassword = @Pwd 

--啟動RPC OUT,啟動這項才可以執行遠程存儲過程
Exec sys.sp_serveroption 
@server = @LinkServerName, 
    @optname = 'RPC OUT',
    @optvalue = N'True' 

Print N'增加連結伺候器:LINKSERVER3 成功!' 

ExitFlag:

Go
Exec sp_AddLinkServer 
@LinkServerName = 'SERVER_xxxxxx', -- nvarchar(128)
        @DataBaseInstance = 'ServerName\InstanceName', -- 伺服器名稱(實例名)
        @User = 'Login', -- 登錄用戶名
        @Pwd = 'password' -- 登錄密碼


Go


#2


修正:
Print N'增加連結伺候器:LINKSERVER3 成功!' -->Print N'增加連結伺候器:'+@LinkServerName+' 成功!'

#3


没看明白,借用牛人的话就是

最好给出完整的表结构,测试数据,计算方法和正确结果.否则耽搁的是你宝贵的时间。
如果有多表,表之间如何关联?



如何更有效地在SQL Server论坛上提问
http://topic.csdn.net/u/20100716/19/6f132f16-20e4-418c-8dee-b99d5f86d320.html?75910

#4


上面发错了,楼主的这种情况没遇到过

#5


引用 2 楼 dvd_01 的回复:
修正:
Print N'增加連結伺候器:LINKSERVER3 成功!' -->Print N'增加連結伺候器:'+@LinkServerName+' 成功!'

您提供的这个方法看起来和我原来的差不多,只是多了些判断和用参数实现了动态连接。我现在纠结的是为什么下面的代码是正确的可以执行,放到存储过程里面了就不行了呢?

#6


 
引用 5 楼 ybw_wang 的回复:
引用 2 楼 dvd_01 的回复:
修正:
Print N'增加連結伺候器:LINKSERVER3 成功!' -->Print N'增加連結伺候器:'+@LinkServerName+' 成功!'

您提供的这个方法看起来和我原来的差不多,只是多了些判断和用参数实现了动态连接。我现在纠结的是为什么下面的代码是正确的可以执行,放到存储过程里面了就不行了呢?


楼主把一些用户名,服务器名,声明成变量试试。可能是你写到存储过程后,像 ''的应该调整的。



USE [BQCK]
GO
SET ANSI_NULLS ON
GO

create procedure [dbo].[p_renshigengxin]
as  

declare @serverName varchar(50),@userName varchar(50),@saUserName varchar(50),
        @objectName varchar(50),@ueerId varchar(20),@flag varchar(50),@demo varchar(60);
select  @serverName ='192.168.1.99' ,@objectName='SQLOLEDB',@demo='brahminu8',
        @objectName='SQLOLEDB',@ueerId='ITSV',@flag='false',@saUserName='sa';

--创建远程连接
exec sp_addlinkedserver @ueerId, '', @objectName, @serverName   
exec sp_addlinkedsrvlogin @ueerId, @flag,null, @saUserName,@demo   
GO
delete renyuanjichu
GO
--插入数据
insert into BQCK.dbo.+++++++++++++++++++代码

#7



create proc pr_name
as
begin
exec sp_addlinkedserver 'ITSV' , '' , 'SQLOLEDB' , '***' 

exec sp_addlinkedsrvlogin 'ITSV' , 'false' , null , 'sa' , '***' 


exec('select * from ITSV.db1.dbo.tb')--这样动态试试

exec sp_dropserver 'ITSV','droplogins' 

end

exec pr_name

#8


創建連接伺候器的存儲與,與含Insert語句的存儲過程分開

#9


先创建链接服务器  在写insert语句

#10


该回复于2011-07-20 14:46:34被版主删除

#11


再写。

#1


樓主,可以參考:
e.g.
use master
GO
if object_id('sp_AddLinkServer') Is Not Null
Drop proc sp_AddLinkServer
Go  

Create proc sp_AddLinkServer
(
@LinkServerName nvarchar(128),
@DataBaseInstance nvarchar(128),
@User nvarchar(128),
@Pwd nvarchar(128)
)
As

If Exists(Select 1 From sys.servers Where name=@LinkServerName)
Exec sys.sp_dropserver 
@server = @LinkServerName,
@droplogins = 'droplogins' --移除 server 的相關遠端和連結伺服器登入

--添加連接伺候器
Exec sys.sp_addlinkedserver 
@server = @LinkServerName,
@srvproduct = 'MYLINK', --產品名稱,不能設置為"SQL Server"值,不然報錯
@provider = N'SQLNCLI',
@datasrc = @DataBaseInstance,
@location = Null,
@provstr = Null, 
@catalog = Null

--對伺候器添加登錄用戶&密碼
 Exec sys.sp_addlinkedsrvlogin 
 @rmtsrvname = @LinkServerName, 
 @useself = N'False',
 @locallogin = Null,
 @rmtuser = @User, 
 @rmtpassword = @Pwd 

--啟動RPC OUT,啟動這項才可以執行遠程存儲過程
Exec sys.sp_serveroption 
@server = @LinkServerName, 
    @optname = 'RPC OUT',
    @optvalue = N'True' 

Print N'增加連結伺候器:LINKSERVER3 成功!' 

ExitFlag:

Go
Exec sp_AddLinkServer 
@LinkServerName = 'SERVER_xxxxxx', -- nvarchar(128)
        @DataBaseInstance = 'ServerName\InstanceName', -- 伺服器名稱(實例名)
        @User = 'Login', -- 登錄用戶名
        @Pwd = 'password' -- 登錄密碼


Go


#2


修正:
Print N'增加連結伺候器:LINKSERVER3 成功!' -->Print N'增加連結伺候器:'+@LinkServerName+' 成功!'

#3


没看明白,借用牛人的话就是

最好给出完整的表结构,测试数据,计算方法和正确结果.否则耽搁的是你宝贵的时间。
如果有多表,表之间如何关联?



如何更有效地在SQL Server论坛上提问
http://topic.csdn.net/u/20100716/19/6f132f16-20e4-418c-8dee-b99d5f86d320.html?75910

#4


上面发错了,楼主的这种情况没遇到过

#5


引用 2 楼 dvd_01 的回复:
修正:
Print N'增加連結伺候器:LINKSERVER3 成功!' -->Print N'增加連結伺候器:'+@LinkServerName+' 成功!'

您提供的这个方法看起来和我原来的差不多,只是多了些判断和用参数实现了动态连接。我现在纠结的是为什么下面的代码是正确的可以执行,放到存储过程里面了就不行了呢?

#6


 
引用 5 楼 ybw_wang 的回复:
引用 2 楼 dvd_01 的回复:
修正:
Print N'增加連結伺候器:LINKSERVER3 成功!' -->Print N'增加連結伺候器:'+@LinkServerName+' 成功!'

您提供的这个方法看起来和我原来的差不多,只是多了些判断和用参数实现了动态连接。我现在纠结的是为什么下面的代码是正确的可以执行,放到存储过程里面了就不行了呢?


楼主把一些用户名,服务器名,声明成变量试试。可能是你写到存储过程后,像 ''的应该调整的。



USE [BQCK]
GO
SET ANSI_NULLS ON
GO

create procedure [dbo].[p_renshigengxin]
as  

declare @serverName varchar(50),@userName varchar(50),@saUserName varchar(50),
        @objectName varchar(50),@ueerId varchar(20),@flag varchar(50),@demo varchar(60);
select  @serverName ='192.168.1.99' ,@objectName='SQLOLEDB',@demo='brahminu8',
        @objectName='SQLOLEDB',@ueerId='ITSV',@flag='false',@saUserName='sa';

--创建远程连接
exec sp_addlinkedserver @ueerId, '', @objectName, @serverName   
exec sp_addlinkedsrvlogin @ueerId, @flag,null, @saUserName,@demo   
GO
delete renyuanjichu
GO
--插入数据
insert into BQCK.dbo.+++++++++++++++++++代码

#7



create proc pr_name
as
begin
exec sp_addlinkedserver 'ITSV' , '' , 'SQLOLEDB' , '***' 

exec sp_addlinkedsrvlogin 'ITSV' , 'false' , null , 'sa' , '***' 


exec('select * from ITSV.db1.dbo.tb')--这样动态试试

exec sp_dropserver 'ITSV','droplogins' 

end

exec pr_name

#8


創建連接伺候器的存儲與,與含Insert語句的存儲過程分開

#9


先创建链接服务器  在写insert语句

#10


该回复于2011-07-20 14:46:34被版主删除

#11


再写。