Step 1:在存儲過程中我用如下方法添加鏈接:if not  exists(select   1   from   master.dbo.sysservers   where   srvname   ='Analyse')
begin   
exec sp_addlinkedserver 'Analyse','SQLSERVER','SQLOLEDB',@Server
exec sp_addlinkedsrvlogin 'Analyse','false',null,@Uid,@Pwd  
endStep 2:取完數據後刪除鏈接:if   exists(select   1   from   master.dbo.sysservers   where   srvname   ='Analyse')
begin 
   exec sp_dropserver 'Analyse','droplogins'
end   問題是,用戶A調用該存儲過程,還沒運行到Step 2,即還沒有刪除連接Analyse;
這時用戶B也調用該存儲過程,Step 1判斷到鏈接Analyse已經存在,所以沒有重新建立鏈接,
但這時用戶B調用鏈接Analyse會出錯。
   該怎麼辦呢?謝謝啦

解决方案 »

  1.   

    --你这里不是已经有判断了吗。不存在的时候才会去创建
    if not  exists(select  1  from  master.dbo.sysservers  where  srvname  ='Analyse') 
    begin  
       exec sp_addlinkedserver 'Analyse','SQLSERVER','SQLOLEDB',@Server 
       exec sp_addlinkedsrvlogin 'Analyse','false',null,@Uid,@Pwd  
    end 
      

  2.   

    隻要Step 1,即不刪除鏈接,不行
    第二次運行的時候不能用第一次建立的鏈接
      

  3.   

    今天要演示了,先改為opendatasource吧
      

  4.   

    這時用戶B也調用該存儲過程,Step 1判斷到鏈接Analyse已經存在,所以沒有重新建立鏈接, 
    但這時用戶B調用鏈接Analyse會出錯。-->>会出什么错呢?第二次運行的時候不能用第一次建立的鏈接那还是试试把step2放到前面,在建立之前先删除连接,然后再重新建立一个连接
      

  5.   

    暈到,改為opendatasource時報無法解決Equal to帶來的排序規格錯誤,用Collate 也沒用
      

  6.   


    和建立後再刪除鏈接沒區別吧
    如用戶A建立鏈接Analyse,並正在使用該鏈接,這時用戶B將鏈接Analyse刪除再重新建立鏈接Analyse,這時用
    戶A能用B建立的鏈接媽?
      

  7.   

    現在的情況就是這樣(隻能一個人調用),目的就是希望同時多個人調用
    我已經改成如下了,即Step 1 和Step 2的順序調過來,現在還沒報錯,我不知道正確與否建立前先刪除鏈接:
    if  exists(select  1  from  master.dbo.sysservers  where  srvname  ='Analyse')
    begin
      exec sp_dropserver 'Analyse','droplogins'
    end 
    然後重新建立鏈接:
    if not  exists(select  1  from  master.dbo.sysservers  where  srvname  ='Analyse')
    begin 
    exec sp_addlinkedserver 'Analyse','SQLSERVER','SQLOLEDB',@Server
    exec sp_addlinkedsrvlogin 'Analyse','false',null,@Uid,@Pwd 
    end
      

  8.   


    1.创建链接服务器之后就不要删除
    我不太理解您的意思
    我的理解是單獨用這句,不sp_dropserver
    if not  exists(select  1  from  master.dbo.sysservers  where  srvname  ='Analyse')
    begin
    exec sp_addlinkedserver 'Analyse','SQLSERVER','SQLOLEDB',@Server
    exec sp_addlinkedsrvlogin 'Analyse','false',null,@Uid,@Pwd
    end 我試過了,不行2.将创建/删除链接服务器的语句移除SP,放在程式的其它地方。
    具體處理方法也不清楚麻煩您解釋一下好嗎?
      

  9.   


    还有一种方法就是,你的伺服器名称不要固定使用Analyse这个名字即存储过程开始动态生成一个Server的名字,然后用这个名字建立链接服务器这样做需要改动的地方是,你的存储过程的语句都需要改成动态执行.像原来的SELECT * FROM Analyse.DBName.dbo.tableName
    需要改成
    EXEC ('SELECT * FROM '+@动态ServerName+'.DBName.dbo.tableName')
      

  10.   

    我明白了,我的存儲過程是跨不同服務器,但同一個存儲過程起同一個鏈接名字,如Analyse
    如用戶A連接服務器100,鏈接名是Analyse,
    這時用戶B連接服務器200,同樣的鏈接名是Analyse
    如果用戶A還在運行,就會報錯,因為服務器200沒有包含服務器100裡的表
    (表名是以服務器做後綴,如服務器100的表是table100)現在想想能不能動態創建鏈接名,如Analyse100、Analyse200實在不好意思啊,是我自己沒把問題弄清楚
      

  11.   

    用服務器做鏈接名,且不刪除鏈接
    改完啦,非常感謝各位!判斷是否已存在的語句寫得不夠簡潔
    create table #L(a int)
    declare @SqlLink nvarchar(1000)
    set @SqlLink=N'insert into #L select   1   from   master.dbo.sysservers   where   srvname   ='''+@Server+''''
    exec  sp_executesql @SqlLink
    if not exists (select a from #L)
    begin
    exec sp_addlinkedserver @Server,'SQLSERVER','SQLOLEDB',@Server
    exec sp_addlinkedsrvlogin @Server,'false',null,@Uid,@Pwd  
    end
      

  12.   


    这里为什么要动态sql判断呢?,直接判断不行吗if not exists (select a from master..sysservers where srvname=@Server)
    begin
    exec sp_addlinkedserver @Server,'SQLSERVER','SQLOLEDB',@Server
    exec sp_addlinkedsrvlogin @Server,'false',null,@Uid,@Pwd 
    end 
      

  13.   

    哦,傻了,
    原來srvname是打算用固定的名字+賬套編號,如Anaylse808,
    select a from master.dbo.sysservers where srvname='Anaylse'+@AccountNo(AccountNo是數據庫名,
    不是服務器名),所以用動態SQL後來想,直接用服務器名@Server就可以了,居然忘了不用动态sql判断
    慚愧
      

  14.   

        一開始就犯了錯誤:一個存儲過程用固定的鏈接名。另自己誤認為用戶A建立的鏈接B不能用,而事實上A和B
    用的是不同的服務器。