linked server 测试是否连接
仙剑 2011-11-18 12:12:22 我想实现这样的功能:
先测试linkedserver是否连通,如果连通,则通过linkedserver执行Insert操作,如果不能连接(比如断网了),给出一条错误消息。
我的代码如下:
use [VCLogIMP]
go
declare @linkserverstate int
declare @linkedserver nvarchar(50)
declare @refid nvarchar(32)
declare @voiceip nvarchar(16)
declare @rootdisk nvarchar(4)
declare @voiceid int
declare @channel int
declare @starttime datetime
declare @stoptime datetime
declare @recordlength int
declare @agent nvarchar(10)
declare @caller nvarchar(50)
declare @called nvarchar(50)
declare @extension nvarchar(20)
declare @direction nvarchar(1)
declare @callerD nvarchar(20)
declare @calledD nvarchar(20)
declare @fileformat int
declare @encryflag nvarchar(1)
declare @inserttime datetime
declare @backupcount int
declare @deletetime datetime
declare @deleteflag nvarchar(1)
declare @deleteidentify nvarchar(20)
declare @reservedone nvarchar(1)
declare @reservedtwo nvarchar(16)
declare @reservedthree nvarchar(16)
declare @reservedfour nvarchar(16)
declare @copyflag int
set @linkedserver ='LS_RECORDDATA'
set @linkserverstate=0
begin try
begin
exec @linkserverstate=sp_testlinkedserver @linkedserver=@linkedserver
if @linkserverstate=0
begin
select 'connected'
--select * from LS_RECORDDATA.VCLogIMP.dbo.RecordOriginalData
declare myCursor cursor for
SELECT [RecordReference]
,[VoiceIP]
,[RootDisk]
,[voiceId]
,[Channel]
,[StartRecordTime]
,[StopRecordTime]
,[RecordLength]
,[AgentID]
,[CallerID]
,[CalledID]
,[Extension]
,[DirectionFlag]
,[CallerDTMF]
,[CalledDTMF]
,[FileFormat]
,[EncryFlag]
,[InsertTime]
,[BackupCount]
,[DeleteFlag]
,[DeleteTime]
,[DeleteIdentify]
,[ReservedOne]
,[ReservedTwo]
,[ReservedThree]
,[ReservedFour]
,[CopyFlag]
FROM [dbo].[T_RecordData] where [CopyFlag]<>-1
open myCursor
fetch next from myCursor into @refid
,@voiceip
,@rootdisk
,@voiceid
,@channel
,@starttime
,@stoptime
,@recordlength
,@agent
,@caller
,@called
,@extension
,@direction
,@callerD
,@calledD
,@fileformat
,@encryflag
,@inserttime
,@backupcount
,@deleteflag
,@deletetime
,@deleteidentify
,@reservedone
,@reservedtwo
,@reservedthree
,@reservedfour
,@copyflag
while @@fetch_status=0
begin
--已经存在,修改同步标记
if exists(select COUNT(*) from [LS_RECORDDATA].[VCLogIMP].[dbo].[RecordOriginalData] where RecordReference=@refid)
begin
begin try
update [dbo].[T_RecordData] set [CopyFlag]=-1 where [RecordReference]=@refid
end try
begin catch
select ERROR_MESSAGE()
end catch
end
else
begin
begin try
--插入新纪录
insert into [LS_RECORDDATA].[VCLogIMP].[dbo].[RecordOriginalData]([RecordReference]
,[VoiceIP]
,[RootDisk]
,[voiceId]
,[Channel]
,[StartRecordTime]
,[StopRecordTime]
,[RecordLength]
,[AgentID]
,[CallerID]
,[CalledID]
,[Extension]
,[DirectionFlag]
,[CallerDTMF]
,[CalledDTMF]
,[FileFormat]
,[EncryFlag]
,[InsertTime]
,[BackupCount]
,[DeleteFlag]
,[DeleteTime]
,[DeleteIdentify]
,[ReservedOne]
,[ReservedTwo]
,[ReservedThree]
,[ReservedFour])
values(@refid
,@voiceip
,@rootdisk
,@voiceid
,@channel
,@starttime
,@stoptime
,@recordlength
,@agent
,@caller
,@called
,@extension
,@direction
,@callerD
,@calledD
,@fileformat
,@encryflag
,@inserttime
,@backupcount
,@deleteflag
,@deletetime
,@deleteidentify
,@reservedone
,@reservedtwo
,@reservedthree
,@reservedfour)
--同步成功,修改同步标记 -1
begin try
update [dbo].[T_RecordData] set [CopyFlag]=-1 where [RecordReference]=@refid
--commit transaction
end try
begin catch
--更新同步标记失败,录音记录=@refid,回滚
--rollback transaction
select ERROR_MESSAGE()
end catch
end try
begin catch
--同步失败,修改同步标记 ,同步次数递增
begin try
update [dbo].[T_RecordData] set [CopyFlag]=(@copyflag+1) where [RecordReference]=@refid
--commit transaction
end try
begin catch
--更新同步标记失败,录音记录=@refid,回滚
--rollback transaction
select ERROR_MESSAGE()
end catch
end catch
end
--下一条纪录
fetch next from myCursor into @refid
,@voiceip
,@rootdisk
,@voiceid
,@channel
,@starttime
,@stoptime
,@recordlength
,@agent
,@caller
,@called
,@extension
,@direction
,@callerD
,@calledD
,@fileformat
,@encryflag
,@inserttime
,@backupcount
,@deleteflag
,@deletetime
,@deleteidentify
,@reservedone
,@reservedtwo
,@reservedthree
,@reservedfour
,@copyflag
end
close myCursor
deallocate myCursor
begin try
delete from [dbo].[T_RecordData] where [CopyFlag] =-1
end try
begin catch
select ERROR_MESSAGE()
end catch
end
end
end try
begin catch
exec dbo.p_WriteHistory 'Connect Server',1,'Server:LS_RECORDDATA(192.168.4.4.40)',@@ERROR
select 'connect error'
end catch
我是用TRY CATCH语句,当连接不上远程服务器时就用存储过程P_WriteHistory向表中插入一条错误消息,但实际上当连接不上远程服务器时并不转入CACTCH语言块,而是直接报错,而且执行时间通常是40到60秒。
请高手帮我分析一下,不胜感激呀!