我在项目中需要访问远程数据库,用来更新本地库,现在的想法是建立一个存储过程,每天在本地执行来更新,代码如下:
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'。请验证指定的服务器名称是否正确。
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'。请验证指定的服务器名称是否正确。
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
Print N'增加連結伺候器:LINKSERVER3 成功!' -->Print N'增加連結伺候器:'+@LinkServerName+' 成功!'
如果有多表,表之间如何关联?如何更有效地在SQL Server论坛上提问
http://topic.csdn.net/u/20100716/19/6f132f16-20e4-418c-8dee-b99d5f86d320.html?75910
楼主把一些用户名,服务器名,声明成变量试试。可能是你写到存储过程后,像 ''的应该调整的。USE [BQCK]
GO
SET ANSI_NULLS ON
GOcreate 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.+++++++++++++++++++代码
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'
endexec pr_name