dmi-stl-dbtest2是另外的一个服务器 ,假设这个服务器down掉了,我想能继续运行sql并且很快获得运行结果(返还一个空值).
DECLARE @MPIsGood BIT
SET @MPIsGood=1
BEGIN TRY
EXEC sp_testlinkedserver N'dmi-stl-dbtest2'
END TRY
BEGIN CATCH
SET @MPIsGood =0
END CATCH
SELECT @MPIsGood
能很快获得运行结果: 0
HQMP.[ManagedPrint].[ServiceTicketBill]是不同服务器的表,我的问题是即使我指定@MPIsGood为0,如果这个服务器当掉的话,我依然不能很快获得结果.
DECLARE @MPIsGood BIT
SET @MPIsGood=0
IF @MPIsGood=1
SELECT APDocID = CASE WHEN @MPIsGood=0 THEN NULL
ELSE
(SELECT TOP 1 APDocID
FROM HQMP.[ManagedPrint].[ServiceTicketBill] WITH (READUNCOMMITTED)
END
运行结果如下:
OLE DB provider "SQLNCLI10" for linked server "HQMP" returned message "Login timeout expired".
OLE DB provider "SQLNCLI10" for linked server "HQMP" returned message "A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.".
Msg 10061, Level 16, State 1, Line 0
TCP Provider: No connection could be made because the target machine actively refused it.
请问有没有什么办法使得即便远程服务器中断,我依然能获得一个返还空值.谢谢
------解决思路----------------------
连接总是需要时间的,如果楼主很急,可以开一个线程在其中进行连接,然后在外面等待指定的时间,
如果有数据了直接返回, 时间到了仍没有数据,返回空,不管线程了.
AutoResetEvent wait = new AutoResetEvent(false); // 信号量变量
wait.Set(); // 子线程中收到数据后发信号
if (wait.WaitOne(2000)) { } // 主线程中等待信号2秒
------解决思路----------------------
可以创建全局临时表,用唯一一条记录的某个字段标记远程服务器的状态。
存储过程先判断该状态字段,如果是可用的,照样运行sql取结果。
如果执行发生掉线错误,就更改该状态字段的值。
下次再调用存储过程,发现状态不可用,直接返回0。
这样除了第一次发现掉线会有较长的等待,其他都能很快获得运行结果。
还有专门开个任务过几分钟就刷新一下状态。