關於添加服務器鏈接的問題

hanjoe109 2008-09-09 05:05:08
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
end

Step 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會出錯。
該怎麼辦呢?謝謝啦
...全文
139 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanjoe109 2008-09-11
  • 打赏
  • 举报
回复
一開始就犯了錯誤:一個存儲過程用固定的鏈接名。另自己誤認為用戶A建立的鏈接B不能用,而事實上A和B
用的是不同的服務器。
hanjoe109 2008-09-10
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 Garnett_KG 的回复:]

还有一种方法就是,你的伺服器名称不要固定使用Analyse这个名字

即存储过程开始动态生成一个Server的名字,然后用这个名字建立链接服务器

这样做需要改动的地方是,你的存储过程的语句都需要改成动态执行.

像原来的

SELECT * FROM Analyse.DBName.dbo.tableName
需要改成
EXEC ('SELECT * FROM '+@动态ServerName+'.DBName.dbo.tableName')



[/Quote]

剛才沒刷新,我回復了才看到,謝謝啦
hanjoe109 2008-09-10
  • 打赏
  • 举报
回复
我明白了,我的存儲過程是跨不同服務器,但同一個存儲過程起同一個鏈接名字,如Analyse
如用戶A連接服務器100,鏈接名是Analyse,
這時用戶B連接服務器200,同樣的鏈接名是Analyse
如果用戶A還在運行,就會報錯,因為服務器200沒有包含服務器100裡的表
(表名是以服務器做後綴,如服務器100的表是table100)

現在想想能不能動態創建鏈接名,如Analyse100、Analyse200

實在不好意思啊,是我自己沒把問題弄清楚
Garnett_KG 2008-09-10
  • 打赏
  • 举报
回复

还有一种方法就是,你的伺服器名称不要固定使用Analyse这个名字

即存储过程开始动态生成一个Server的名字,然后用这个名字建立链接服务器

这样做需要改动的地方是,你的存储过程的语句都需要改成动态执行.

像原来的

SELECT * FROM Analyse.DBName.dbo.tableName
需要改成
EXEC ('SELECT * FROM '+@动态ServerName+'.DBName.dbo.tableName')


hanjoe109 2008-09-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Garnett_KG 的回复:]

两种解决方案

1.创建链接服务器之后就不要删除


2.将创建/删除链接服务器的语句移除SP,放在程式的其它地方。

[/Quote]

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,放在程式的其它地方。
具體處理方法也不清楚

麻煩您解釋一下好嗎?
hanjoe109 2008-09-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 Garnett_KG 的回复:]
好奇怪的需求.

你的存储过程听起来是同一个时间只能由一个人调用(第二个人不能用第一个人建立的链接)

是这样吗?

[/Quote]
現在的情況就是這樣(隻能一個人調用),目的就是希望同時多個人調用
我已經改成如下了,即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



Garnett_KG 2008-09-10
  • 打赏
  • 举报
回复
好奇怪的需求.

你的存储过程听起来是同一个时间只能由一个人调用(第二个人不能用第一个人建立的链接)

是这样吗?
zhihuixiaole 2008-09-10
  • 打赏
  • 举报
回复
mark
hanjoe109 2008-09-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 HEROWANG 的回复:]
那还是试试把step2放到前面,在建立之前先删除连接,然后再重新建立一个连接
[/Quote]

和建立後再刪除鏈接沒區別吧
如用戶A建立鏈接Analyse,並正在使用該鏈接,這時用戶B將鏈接Analyse刪除再重新建立鏈接Analyse,這時用
戶A能用B建立的鏈接媽?
hanjoe109 2008-09-10
  • 打赏
  • 举报
回复
暈到,改為opendatasource時報無法解決Equal to帶來的排序規格錯誤,用Collate 也沒用
  • 打赏
  • 举报
回复
這時用戶B也調用該存儲過程,Step 1判斷到鏈接Analyse已經存在,所以沒有重新建立鏈接,
但這時用戶B調用鏈接Analyse會出錯。

-->>会出什么错呢?

第二次運行的時候不能用第一次建立的鏈接

那还是试试把step2放到前面,在建立之前先删除连接,然后再重新建立一个连接
hanjoe109 2008-09-10
  • 打赏
  • 举报
回复
今天要演示了,先改為opendatasource吧
hanjoe109 2008-09-10
  • 打赏
  • 举报
回复
隻要Step 1,即不刪除鏈接,不行
第二次運行的時候不能用第一次建立的鏈接
guoli0813 2008-09-10
  • 打赏
  • 举报
回复
留下脚印
hanjoe109 2008-09-10
  • 打赏
  • 举报
回复
哦,傻了,
原來srvname是打算用固定的名字+賬套編號,如Anaylse808,
select a from master.dbo.sysservers where srvname='Anaylse'+@AccountNo(AccountNo是數據庫名,
不是服務器名),所以用動態SQL

後來想,直接用服務器名@Server就可以了,居然忘了不用动态sql判断
慚愧
Garnett_KG 2008-09-10
  • 打赏
  • 举报
回复

这里为什么要动态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

hanjoe109 2008-09-10
  • 打赏
  • 举报
回复
用服務器做鏈接名,且不刪除鏈接
改完啦,非常感謝各位!

判斷是否已存在的語句寫得不夠簡潔
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
pt1314917 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hanjoe109 的回复:]
引用 3 楼 pt1314917 的回复:
直接步骤1就行了,何必删除连接服务器呢


不刪除又建立相同的名字,不會出錯?明天試一下
[/Quote]


--你这里不是已经有判断了吗。不存在的时候才会去创建。。。
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
hanjoe109 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pt1314917 的回复:]
直接步骤1就行了,何必删除连接服务器呢
[/Quote]

不刪除又建立相同的名字,不會出錯?明天試一下
Garnett_KG 2008-09-09
  • 打赏
  • 举报
回复

两种解决方案

1.创建链接服务器之后就不要删除


2.将创建/删除链接服务器的语句移除SP,放在程式的其它地方。
加载更多回复(3)

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧