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會出錯。
該怎麼辦呢?謝謝啦
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會出錯。
該怎麼辦呢?謝謝啦
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
第二次運行的時候不能用第一次建立的鏈接
但這時用戶B調用鏈接Analyse會出錯。-->>会出什么错呢?第二次運行的時候不能用第一次建立的鏈接那还是试试把step2放到前面,在建立之前先删除连接,然后再重新建立一个连接
和建立後再刪除鏈接沒區別吧
如用戶A建立鏈接Analyse,並正在使用該鏈接,這時用戶B將鏈接Analyse刪除再重新建立鏈接Analyse,這時用
戶A能用B建立的鏈接媽?
我已經改成如下了,即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
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,放在程式的其它地方。
具體處理方法也不清楚麻煩您解釋一下好嗎?
还有一种方法就是,你的伺服器名称不要固定使用Analyse这个名字即存储过程开始动态生成一个Server的名字,然后用这个名字建立链接服务器这样做需要改动的地方是,你的存储过程的语句都需要改成动态执行.像原来的SELECT * FROM Analyse.DBName.dbo.tableName
需要改成
EXEC ('SELECT * FROM '+@动态ServerName+'.DBName.dbo.tableName')
如用戶A連接服務器100,鏈接名是Analyse,
這時用戶B連接服務器200,同樣的鏈接名是Analyse
如果用戶A還在運行,就會報錯,因為服務器200沒有包含服務器100裡的表
(表名是以服務器做後綴,如服務器100的表是table100)現在想想能不能動態創建鏈接名,如Analyse100、Analyse200實在不好意思啊,是我自己沒把問題弄清楚
改完啦,非常感謝各位!判斷是否已存在的語句寫得不夠簡潔
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
这里为什么要动态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
原來srvname是打算用固定的名字+賬套編號,如Anaylse808,
select a from master.dbo.sysservers where srvname='Anaylse'+@AccountNo(AccountNo是數據庫名,
不是服務器名),所以用動態SQL後來想,直接用服務器名@Server就可以了,居然忘了不用动态sql判断
慚愧
用的是不同的服務器。