我在项目中需要访问远程数据库,用来更新本地库,现在的想法是建立一个存储过程,每天在本地执行来更新,代码如下:
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'。请验证指定的服务器名称是否正确。

解决方案 »

  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.   


    楼主把一些用户名,服务器名,声明成变量试试。可能是你写到存储过程后,像 ''的应该调整的。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.+++++++++++++++++++代码
      

  5.   


    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
      

  6.   

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

  7.   

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