create proc sp_InnerImport
(
 @serverIP nvarchar(32)
)
as
begin
--一行一行执行下面的存储过程语句就是对的,可一起就是错的
   set nocount on
if  exists(select 1   
       from master.dbo.sysservers   
   where srvname='RemoteServer'
  )
  begin
    exec sp_dropserver @server='RemoteServer',@droplogins='droplogins'
  end
  exec sp_addlinkedserver @server='RemoteServer',
                          @srvproduct='',
  @provider='SQLOLEDB',
                          @datasrc='127.0.0.1'          exec sp_addlinkedsrvlogin @rmtsrvname='RemoteServer',
                                    @useself='false',
                                    @locallogin=null,
                                    @rmtuser='sa',
                                    @rmtpassword='zrx'
--总是在下面报错
          --select   *   from  RemoteServer.Test.dbo.abc
select * 
FROM openquery(RemoteServer,  'SELECT *  FROM Test.dbo.User ')    exec sp_dropserver @server='RemoteServer',@droplogins='droplogins'
end
go

解决方案 »

  1.   

    一般情况下linkserver是创建好了不删除的,方便再次调用
    ---try:
    create proc sp_InnerImport 

     @serverIP nvarchar(32) 

    as 
    begin 
    --一行一行执行下面的存储过程语句就是对的,可一起就是错的 
       set nocount on 
    if  exists(select 1    
           from master.dbo.sysservers    
       where srvname='RemoteServer' 
      ) 
      begin 
        exec sp_dropserver @server='RemoteServer',@droplogins='droplogins' 
      end 
      exec sp_addlinkedserver @server='RemoteServer', 
                              @srvproduct='', 
      @provider='SQLOLEDB', 
                              @datasrc='127.0.0.1'           exec sp_addlinkedsrvlogin @rmtsrvname='RemoteServer', 
                                        @useself='false', 
                                        @locallogin=null, 
                                        @rmtuser='sa', 
                                        @rmtpassword='zrx' 
    --总是在下面报错 
              --select   *   from  RemoteServer.Test.dbo.abc 
    waitfor delay '00:00:05'
    select *  
    FROM openquery(RemoteServer,  'SELECT *  FROM Test.dbo.User ')    exec sp_dropserver @server='RemoteServer',@droplogins='droplogins' 
    end 
    go 
      

  2.   

    create proc sp_InnerImport 

     @serverIP nvarchar(32) 

    as 
    begin 
    --一行一行执行下面的存储过程语句就是对的,可一起就是错的 
       set nocount on 
    if  exists(select 1    
           from master.dbo.sysservers    
       where srvname='RemoteServer' 
      ) 
      begin 
        exec sp_dropserver @server='RemoteServer',@droplogins='droplogins' 
      end 
      exec sp_addlinkedserver @server='RemoteServer', 
                              @srvproduct='', 
      @provider='SQLOLEDB', 
                              @datasrc='127.0.0.1'           exec sp_addlinkedsrvlogin @rmtsrvname='RemoteServer', 
                                        @useself='false', 
                                        @locallogin=null, 
                                        @rmtuser='sa', 
                                        @rmtpassword='zrx' 
    --总是在下面报错 ,
    --+go,批处理结束
    go          --select   *   from  RemoteServer.Test.dbo.abc 
    select *  
    FROM openquery(RemoteServer,  'SELECT *  FROM Test.dbo.User ')    exec sp_dropserver @server='RemoteServer',@droplogins='droplogins' 
    end 
    go
      

  3.   

    服务器: 消息 7202,级别 11,状态 2,过程 sp_InnerImport,行 27
    在 sysservers 中未能找到服务器 'RemoteServer'。请执行 sp_addlinkedserver 以将服务器添加到 sysservers。
      

  4.   

    create proc sp_InnerImport 

     @serverIP nvarchar(32) 

    as 
    begin 
    --一行一行执行下面的存储过程语句就是对的,可一起就是错的 
       set nocount on 
    if  exists(select 1    
           from master.dbo.sysservers    
       where srvname='.' 
      ) 
      begin 
        exec sp_dropserver @server='.',@droplogins='droplogins' 
      end 
      exec sp_addlinkedserver @server='RemoteServer', 
                              @srvproduct='', 
      @provider='SQLOLEDB', 
                              @datasrc='127.0.0.1'           exec sp_addlinkedsrvlogin @rmtsrvname='.', 
                                        @useself='false', 
                                        @locallogin=null, 
                                        @rmtuser='sa', 
                                        @rmtpassword='zrx' 
    --总是在下面报错 
              --select   *   from  RemoteServer.Test.dbo.abc 
    waitfor delay '00:00:05'
    exec('select *  
    FROM openquery(RemoteServer,''SELECT *  FROM Test.dbo.User '')')  exec sp_dropserver @server='.',@droplogins='droplogins' 
    end 
    go 
    drop proc sp_InnerImport
      

  5.   

    你们两位的办法都不对嘛,特别是viva369的,存储过程里都go了,就立即退出了,后面的查询是根本不能够执行的, 总之还是报那个错,  而且很奇怪的是, 我下楼打杯水过一会后就又能够重新创建成功了, 而且连续按F5都不报错, 但就在执行成功停几秒后再执行又开始报错了.这是怎么回事情呀??
      

  6.   

    waitfor delay '00:00:05'
    exec('select *  
    FROM openquery(RemoteServer,''SELECT *  FROM Test.dbo.User '')')
    ---这样也不对呀?
    那是你的链接服务器没有先存在,你就select当然会报错的呀
      

  7.   

    +go不会退出的,又不是return存储过程一般是在你第一次调用的时候执行解析的。
      

  8.   

    或者你试试这样的写法
    EXEC sp_addlinkedserver 'mbo-srv-05', N'SQL Server'  
    exec sp_addlinkedsrvlogin 'mbo-srv-05','false',null,'sa','Password01!';  
    exec  (   'use dmsdb     select * from menu'  ) 
    at 
    [mbo-srv-05]
      

  9.   

    create proc sp_InnerImport 

     @serverIP nvarchar(32) 

    as 
    begin 
    --一行一行执行下面的存储过程语句就是对的,可一起就是错的 
       set nocount on 
    if  exists(select 1    
           from master.dbo.sysservers    
       where srvname='.' 
      ) 
      begin 
        exec sp_dropserver @server='.',@droplogins='droplogins' 
      end 
      exec sp_addlinkedserver @server='RemoteServer', 
                              @srvproduct='', 
      @provider='SQLOLEDB', 
                              @datasrc='127.0.0.1'           exec sp_addlinkedsrvlogin @rmtsrvname='.', 
                                        @useself='false', 
                                        @locallogin=null, 
                                        @rmtuser='sa', 
                                        @rmtpassword='zrx' 
    --总是在下面报错 
              --select   *   from  RemoteServer.Test.dbo.abc 
    waitfor delay '00:00:05'
    exec('select *  
    FROM openquery(RemoteServer,''SELECT *  FROM Test.dbo.User '')')  exec sp_dropserver @server='.',@droplogins='droplogins' 
    end 
    go 
    这个可以反复创建了, 但是,我在使用的时候总是显示正在执行批查询, 比刚才多花很长时间才能够出结果. 这又是为什么呢?刚才只要能够创建成功就能够很快出结果,因为waitfor delay '00:00:05' 吗? 为什么要有这个语句?
      

  10.   

    waitfor delay '00:00:05'改小
    waitfor delay '00:00:02'
    如果还慢但是结果  正常时改
    waitfor delay '00:00:01'
      

  11.   

    稍稍延迟,保证linkserver创建成功呀
      

  12.   

    我现在是这样写的,又可以F5反复创建存储过程了if exists(select * from sysobjects where xtype='P' and name='sp_InnerImport')
      drop proc sp_InnerImport
    gocreate proc sp_InnerImport
    (
     @serverIP nvarchar(32)
    )
    as
    begin
       set nocount on
    if  exists(select 1   
           from master.dbo.sysservers   
       where srvname='RemoteServer'
      )
      begin
        exec sp_dropserver @server='RemoteServer',@droplogins='droplogins'
      end
      exec sp_addlinkedserver @server='RemoteServer',
                              @srvproduct='',
      @provider='SQLOLEDB',
                              @datasrc=@serverIP          exec sp_addlinkedsrvlogin @rmtsrvname='RemoteServer',
                                        @useself='false',
                                        @locallogin=null,
                                        @rmtuser='sa',
                                        @rmtpassword='zrx'          --select   *   from  RemoteServer.Test.dbo.abc
    --select * FROM openquery(RemoteServer,  'SELECT *  FROM Test.dbo.abc ') --waitfor delay '00:00:05'
    exec('select * FROM openquery(RemoteServer,''SELECT *  FROM Test.dbo.abc '')')   exec sp_dropserver @server='RemoteServer',@droplogins='droplogins'
    end
    go
      

  13.   

    为什么用这句就是可以了呢?
    exec('select * FROM openquery(RemoteServer,''SELECT *  FROM Test.dbo.abc '')') 
      

  14.   

    我之所以这么做是因为我用下面的语句查出来的,如果不删除的话,关联远程服务器就不会变
    select   *   from   master.dbo.sysservers