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.
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+' 成功!'
Print N'增加連結伺候器:LINKSERVER3 成功!' -->Print N'增加連結伺候器:'+@LinkServerName+' 成功!'
#3
没看明白,借用牛人的话就是
最好给出完整的表结构,测试数据,计算方法和正确结果.否则耽搁的是你宝贵的时间。
如果有多表,表之间如何关联?
如何更有效地在SQL Server论坛上提问
http://topic.csdn.net/u/20100716/19/6f132f16-20e4-418c-8dee-b99d5f86d320.html?75910
最好给出完整的表结构,测试数据,计算方法和正确结果.否则耽搁的是你宝贵的时间。
如果有多表,表之间如何关联?
如何更有效地在SQL Server论坛上提问
http://topic.csdn.net/u/20100716/19/6f132f16-20e4-418c-8dee-b99d5f86d320.html?75910
#4
上面发错了,楼主的这种情况没遇到过
#5
您提供的这个方法看起来和我原来的差不多,只是多了些判断和用参数实现了动态连接。我现在纠结的是为什么下面的代码是正确的可以执行,放到存储过程里面了就不行了呢?
#6
楼主把一些用户名,服务器名,声明成变量试试。可能是你写到存储过程后,像 ''的应该调整的。
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
#11
再写。
#1
樓主,可以參考:
e.g.
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+' 成功!'
Print N'增加連結伺候器:LINKSERVER3 成功!' -->Print N'增加連結伺候器:'+@LinkServerName+' 成功!'
#3
没看明白,借用牛人的话就是
最好给出完整的表结构,测试数据,计算方法和正确结果.否则耽搁的是你宝贵的时间。
如果有多表,表之间如何关联?
如何更有效地在SQL Server论坛上提问
http://topic.csdn.net/u/20100716/19/6f132f16-20e4-418c-8dee-b99d5f86d320.html?75910
最好给出完整的表结构,测试数据,计算方法和正确结果.否则耽搁的是你宝贵的时间。
如果有多表,表之间如何关联?
如何更有效地在SQL Server论坛上提问
http://topic.csdn.net/u/20100716/19/6f132f16-20e4-418c-8dee-b99d5f86d320.html?75910
#4
上面发错了,楼主的这种情况没遇到过
#5
您提供的这个方法看起来和我原来的差不多,只是多了些判断和用参数实现了动态连接。我现在纠结的是为什么下面的代码是正确的可以执行,放到存储过程里面了就不行了呢?
#6
楼主把一些用户名,服务器名,声明成变量试试。可能是你写到存储过程后,像 ''的应该调整的。
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
#11
再写。